这个问题已经在这里有一个答案:
- 应该IBOutlets是ARC下强还是弱? 11个回答
我转我的项目ARC,如果我必须用我不明白strong
或weak
的IBOutlets。 Xcode中做到这一点:在界面生成器,如果创建UILabel
例如,我和助理编辑我将它连接ViewController
,它创建此:
@property (nonatomic, strong) UILabel *aLabel;
它采用了strong
,而不是我读RayWenderlich网站上的教程,这样说:
但对于这两个特殊性质我有另外的计划。 取而代之的strong
,我们将其声明为weak
。
@property (nonatomic, weak) IBOutlet UITableView *tableView;
@property (nonatomic, weak) IBOutlet UISearchBar *searchBar;
Weak
是所有出口性质的推荐关系。 这些视图对象已经在视图控制器的视图层次的一部分,不需要在其他地方保留。 声明你出口的一大优势weak
的是,它可以节省您的时间编写的viewDidUnload方法。
目前,我们的viewDidUnload
看起来是这样的:
- (void)viewDidUnload
{
[super viewDidUnload];
self.tableView = nil;
self.searchBar = nil;
soundEffect = nil;
}
现在,你可以把它简化为以下几点:
- (void)viewDidUnload
{
[super viewDidUnload];
soundEffect = nil;
}
因此,使用weak
,而不是strong
,并删除设置为nil在videDidUnload
,而不是Xcode中使用strong
,并使用self... = nil
在viewDidUnload
。
我的问题是:做的时候我一定要使用strong
,当weak
? 我想也用于部署目标的iOS 4,所以,当我不得不使用unsafe_unretain
? 任何人都可以帮助解释我还有一个小教程,使用时strong
, weak
和unsafe_unretain
与ARC?
经验法则
当父母有到子对象的引用,你应该使用一个strong
参考。 当孩子有它的父对象的引用,你应该使用一个weak
引用或unsafe_unretained
一个(如果前者不可用)。 一个典型的例子是,当你处理的代表。 例如, UITableViewDelegate
不保留包含表视图控制器类。
这里一个简单的模式来呈现的主要概念。
首先假设A,B和C是strong
引用。 特别地,C具有strong
REF到其父。 当OBJ1被释放(的地方),在A引用不存在了,但是你有一个泄漏,因为有OBJ1和OBJ2之间的循环。 在保留数( 仅用于解释的目的 )来说的,OBJ1具有为2的保留计数(OBJ2具有strong
参考吧),而obj2的具有1的保留计数如果OBJ1被释放,目前其保留计数为1和它的dealloc
方法没有被调用。 OBJ1和OBJ2仍保留在内存中,但没有人给他们一个参考: 泄漏 。
在contary,如果只有A和B是strong
裁判和C限定为weak
一切正常。 你有没有泄漏。 事实上,当OBJ1被释放,这也释放obj2的。 在保留数来说的,OBJ1具有1的保留计数,obj2的有如果OBJ1被释放1.保留计数,其保留计数为0,它dealloc
方法被调用。 OBJ1和OBJ2被从内存中删除。
一个简单的建议:开始考虑在对象图而言,当你处理ARC。
关于第一个问题,这两种解决方案是有效的,当你处理XIBs。 一般来说weak
当你处理存储周期参考使用。 关于XIBs文件,如果你用strong
,你需要设置nil
的viewDidUnload
,因为如果你不这样做,在内存不足的条件下,你可能会导致意外的泄漏。 你不释放他们dealloc
因为ARC会为你做它。 weak
,因为,当目标对象被销毁,这些值被设定为替代不需要那么治疗nil
自动。 没有了悬摆指针。
如果你有兴趣,我真的建议你阅读周五-QA-2012-04-13-笔尖内存管理由Mike灰 。
关于你的第二个问题,如果你需要支持的iOS 4,而不是weak
,你必须使用unsafe_unretained
。
内,从而有很多问题/答案。 在这里,主要有:
如何使用ARC和定位的iOS 4.0,当我更换弱引用?
什么样的泄漏确实在Objective-C自动引用计数不能防止或减少?
使用ARC,寿命限定符分配和unsafe_unretained
强/弱/保留/ unsafe_unretained /分配
希望帮助。
更新
按照shaunlim的评论,从iOS 6中开始viewDidUnload
方法已经过时了。 在这里,我真的建议看Rob的答案: 的iOS 6 - viewDidUnload迁移到didReceiveMemoryWarning? 。
您可以使用弱的这些,因为在这种情况下,物体将在那里只要上海华有通过IBOutlets连接到IB对象的对象。 这是因为上海华具有很强的指向其子视图。
如果定义指针是唯一的指向一个对象,你应该把它声明为强。
如果你是一个注册的开发者,我强烈建议你看看到从WWDC11和WWDC12的影片。 另一个很好的资源是从iOS开发播客斯坦福大学。