为什么 iOS 开发中,控件一般为 weak 而不是 weak和strong的用法

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
您的访问请求被拒绝 403 Forbidden - ITeye技术社区
您的访问请求被拒绝
亲爱的会员,您的IP地址所在网段被ITeye拒绝服务,这可能是以下两种情况导致:
一、您所在的网段内有网络爬虫大量抓取ITeye网页,为保证其他人流畅的访问ITeye,该网段被ITeye拒绝
二、您通过某个代理服务器访问ITeye网站,该代理服务器被网络爬虫利用,大量抓取ITeye网页
请您点击按钮解除封锁&为什么 iOS 开发中,控件一般为 weak 而不是 strong_百度知道
为什么 iOS 开发中,控件一般为 weak 而不是 strong
提问者采纳
当然这种情况还是比较少的,bool,我们不再指向它的条件只有我们指向nil或者我自己也不在内存上一般来说用weak会比较好, 一般是alloc用strong,表示数字类型用week.。这个主要取决于这个View是否将引用它的对象强引用了,但是大多情况下strong也没问题,它就会被清。 也就是说我强力指向了一个区域.
看个人爱好,int。
strong和weak的区别 strong表示保留它指向的堆上的内存区域不再指向这块区域了,没有人strong指向我了,爱好不同,doule,有的人喜欢用strong,有的人喜欢有week,weak表示如果还没有人指向它了.
知道智能回答机器人
我是知道站内的人工智能,可高效智能地为您解答问题。很高兴为您服务。
其他类似问题
为您推荐:
ios的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁对于初学的,对于assign、retain、copy、strong、weak的用法及意义可能不是很明白,我对于这个问题也研究了很久,写篇博文,巧巧代码,让我们来瞧瞧吧!先定义一个Student类:#import &Foundation/Foundation.h&
@ Student : NSObject
@property (nonatomic, copy) NSString *
然后先是mrc下的assign声明@property (nonatomic, assign) Student *stu1;接下来初始化一个Student对象,并且敲入以下代码- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
Student *stu = [[Student alloc] init];
stu.name = @&张三&;
self.stu1 =
NSLog(@&%p %p&, &stu, &_stu1);
NSLog(@&%p %p&, stu,_stu1);
self.stu1.name = @&李四&;
NSLog(@&stu.name = %@&, stu.name);
NSLog(@&stu的引用计数 = %ld&, [stu retainCount]);
}控制台输出(一)所以我总结,assign只是使指向stu的栈内存上的的指针,也就是stu换了一个名字,换成了stu1,就是stu和stu1的作用和意义是一样的,谁做了任何改变对应的指向栈内存的内容也会随之改变,但是栈内存的引用计数还是1没有增加。接下来我们看看retain,改变stu1属性为以下@property (nonatomic, retain) Student *stu1;然后重新运行控制台输出为:(二)再来总结一下,retain是使指向栈内存的指针多了一个,也就是引用计数加1,并且指针stu和stu1对于栈内存的作用是一样的,也就是一扇门多了一把钥匙接下来再看看copy的作用,同样改变stu属性为copy,但是如果是我们定义的对象,那么我们自己要实现NSCopying,这样就能调用copy,贴出代码Student.h#import &Foundation/Foundation.h&
@interface Student : NSObject&NSCopying&
@property (nonatomic, copy) NSString *
@endStudent.m#import &Student.h&
@implementation Student
- (id)copyWithZone:(NSZone *)zone
Student *stuCopy = [[[self class] allocWithZone:zone] init];
return stuC
@endviewDidLoad里的代码不变,运行程序,控制台输出(三)可以看出,stu.name没有改变,而且stu的引用计数没用增加,为什么呢?因为copy是完全复制一段栈内存,所以copy出来的对象与原来的对象是两个不同地址的对象,所以对于stu没有影响好了,接下来我们看看arc模式下,strong和weak的区别及用法.先是strong,声明属性@property (nonatomic, strong) Student *stu1;viewDidLoad中的代码- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
Student *stu = [[Student alloc] init];
self.stu1 =
NSLog(@&%p %p&, &stu, &_stu1);
NSLog(@&%p %p&, stu, _stu1);
NSLog(@&将stu滞空之后&);
NSLog(@&%p %p&, &stu, &_stu1);
NSLog(@&%p %p&, stu, _stu1);
}控制台输出(四)可以看出,当将stu赋&#20540;给stu1之后,这两个指针指向的栈内存是一样的,也就是说这里和retain是一样的,但是当我们将stu滞空后,stu1指向的栈内存并没有变为空,这就是strong与retain的区别,当栈内存只要有两个或者两个以上指针指向的时候,对其中指针进行滞空操作都不会释放掉栈内存,也就是strong出来的对象,对于栈内存有控制权,还有一点,arc下默认的赋&#20540;方式就是strong接下来,我们看看weak其他都一样,把stu1属性改为weak,运行程序,控制台输出(五)可以看出,当将stu赋&#20540;给stu1之后,这两个指针指向的栈内存是一样的,也就是说这里和retain是一样的,但是当我们将stu滞空后,stu1指向的栈内存变为空,这就是weak与strong的区别,也就是weak出来的对象,对于栈内存没有控制权这里说一下,为什么不用NString测试,因为NString *str = @“dddd”,然后str = @“bbbb”,是新开辟一个栈内存来存放“bbbb”不是在原有的基础上改的。用string做retain测试,大家会发现,无论怎么样retain,但是改变其中一个变量后,另一个不变。
版权声明:本文为博主原创,未经博主允许不得转载。主题 : weak和strong创建UI控件的问题
级别: 新手上路
UID: 382809
可可豆: 637 CB
威望: 385 点
在线时间: 185(时)
发自: Web Page
来源于&&分类
weak和strong创建UI控件的问题&&&
@property (weak,nonatomic) UILabel *nameL
UILabel *nameLabel = [[UILabel alloc] init];
self.nameLabel = nameL
strong情况
@property (strong,nonatomic) UILabel *timeL
- (UILabel *)timeLabel
&&&&if (!_timeLabel) {
&&&&&&&&_timeLabel = [[UILabel alloc] init];
&&&&return _timeL
这两种方法创建UI有什么区别?哪种比较好啊?
Never stop coding even segment fault.
级别: 侠客
UID: 278883
可可豆: 228 CB
威望: 177 点
在线时间: 204(时)
发自: Web Page
weak/atrong主要是为了避免循环强引用&#160;&#160; 比如父类中含有子类{父类retain了子类},子类中又调用了父类{子类又retain了父类},这样都无法release
我不生产代码 我只是github的搬运工
级别: 新手上路
可可豆: 3 CB
威望: 3 点
在线时间: 1(时)
发自: Web Page
recyle&#160;strong&#160;&#160;retain &#160; 引用 引用第1楼pincer于 18:51发表的&&:weak/atrong主要是为了避免循环强引用&#160;&#160; 比如父类中含有子类{父类retain了子类},子类中又调用了父类{子类又retain了父类},这样都无法release
级别: 精灵王
发帖: 1311
可可豆: 1444 CB
威望: 1448 点
在线时间: 3072(时)
发自: Web Page
一般来说用weak会比较好,但是大多情况下strong也没问题。这个主要取决于这个View是否将引用它的对象强引用了。当然这种情况还是比较少的。
关注本帖(如果有新回复会站内信通知您)
4*5+2 正确答案:22
发帖、回帖都会得到可观的积分奖励。
按"Ctrl+Enter"直接提交
关注CocoaChina
关注微信 每日推荐
扫一扫 浏览移动版ios开发(9)
delegate 为什么应该是&weak 类型而不是strong类型
对象a创建并引用了对象b.对象b创建并引用了对象c.对象c创建并引用了对象b.
这时候b和c的引用计数分别是2和1。当a不再使用b,调用release释放对b的所有权,因为c还引用了b,所以b的引用计数为1,b不会被释放。b不释放,c的引用计数就是1,c也不会被释放。从此,b和c永远留在内存中。
打断这种循环引用:
如果c引用b的时候是用weak类型弱引用,那么a释放b时,b的引用计数器变为0,b被释放,c也被释放。
一个例子:
// A.m中某处&
B* b = [B alloc] init];&
b.delegate = self;&
[self.view addSubview:b];
[b release];
delegate没有必要是strong
是A负责创建B的,A的生命周期一定比B要长(B存在,A一定也存在;A存在,B不一定存在)
在B(实例b)存在的时候,A(的实例)一定存在,
所以没有必要用retain将引用计数&#43;1,assign足以&
退一步假设存在这样的情况:A比B先挂掉(A的实例先被release销毁)
那么当然希望是[a relase]后,A中的方法不再被B调用,但是使用retain时候,A还是没有被销毁,so
A中的方法仍会被B调用,但是assgin就无此问题&
避免循环引用
两个类互相强引用,referance counting永远不会是0,一直会占用内存,如果delegate是弱引用,那delegate释放掉之后,这个类也可以被释放
另一个例子:
一个UITableViewController
对象a通过retain获取了UITableView对象b的所有权,这个UITableView对象b的delegate又是a,
如果这个delegate是retain方式的,那基本上就没有机会释放这两个对象了。
循环引用而产生的内存泄露也是Instrument无法发现的
所以delegate必须设置为weak类型
iOS 5 ARC完全指南.pdf&
http://blog.csdn.net/diyagoanyhacker/article/details/6591593
/ask/questions/show/93387
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:7627次
排名:千里之外
原创:12篇
(7)(3)(1)(1)(1)

我要回帖

更多关于 weakify strongify 的文章

 

随机推荐