弱或强于IBOutlet中和其他[复制](weak or strong for IBOutlet a

2019-06-25 16:40发布

这个问题已经在这里有一个答案:

  • 应该IBOutlets是ARC下强还是弱? 11个回答

我转我的项目ARC,如果我必须用我不明白strongweak的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... = nilviewDidUnload

我的问题是:做的时候我一定要使用strong ,当weak ? 我想也用于部署目标的iOS 4,所以,当我不得不使用unsafe_unretain ? 任何人都可以帮助解释我还有一个小教程,使用时strongweakunsafe_unretain与ARC?

Answer 1:

经验法则

当父母有到子对象的引用,你应该使用一个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 ,你需要设置nilviewDidUnload ,因为如果你不这样做,在内存不足的条件下,你可能会导致意外的泄漏。 你不释放他们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? 。



Answer 2:

您可以使用弱的这些,因为在这种情况下,物体将在那里只要上海华有通过IBOutlets连接到IB对象的对象。 这是因为上海华具有很强的指向其子视图。

如果定义指针是唯一的指向一个对象,你应该把它声明为强。

如果你是一个注册的开发者,我强烈建议你看看到从WWDC11和WWDC12的影片。 另一个很好的资源是从iOS开发播客斯坦福大学。



文章来源: weak or strong for IBOutlet and other [duplicate]