ios IBOutlet和其他的弱或强[重复]

ubof19bj  于 2022-12-27  发布在  iOS
关注(0)|答案(2)|浏览(126)
    • 此问题在此处已有答案**:

Should IBOutlets be strong or weak under ARC?(11个答案)
九年前就关门了。
我已经将我的项目切换到ARC,但我不知道IBOutlets是否必须使用strongweak。例如,在Interface Builder中,如果创建了一个UILabel,且我使用Assistant Editor将其连接到ViewController,则它将创建以下内容:

@property (nonatomic, strong) UILabel *aLabel;

它使用strong,而不是我读了RayWenderlich网站上的教程,上面说:
但是对于这两个特殊的属性,我有其他的计划,我们将它们声明为weak,而不是strong

@property (nonatomic, weak) IBOutlet UITableView *tableView;
@property (nonatomic, weak) IBOutlet UISearchBar *searchBar;

Weak是所有 * outlet * 属性的推荐关系。这些视图对象已经是视图控制器的视图层次结构的一部分,不需要保留在其他地方。声明outlet weak的最大好处是节省了编写viewDidUnload方法的时间。
目前我们的viewDidUnload如下所示:

- (void)viewDidUnload
{
    [super viewDidUnload];
    self.tableView = nil;
    self.searchBar = nil;
    soundEffect = nil;
}

现在,您可以将其简化为以下内容:

- (void)viewDidUnload
{
    [super viewDidUnload];
    soundEffect = nil;
}

因此,使用weak,而不是strong,并删除videDidUnload中的nil设置,而Xcode使用strong,并使用viewDidUnload中的self... = nil
我的问题是:我什么时候必须使用strong,什么时候必须使用weak?我还想使用部署目标iOS 4,那么我什么时候必须使用unsafe_unretain?任何人都可以通过一个小教程来帮助我很好地解释,什么时候使用strongweakunsafe_unretain与ARC?

9q78igpj

9q78igpj1#

"经验法则"

  • 当父对象引用子对象时,您应该使用strong引用。当子对象引用其父对象时,您应该使用weak引用或unsafe_unretained引用(如果前者不可用)。典型的情况是处理委托时。例如,UITableViewDelegate不保留包含表视图的控制器类。*

这里用一个简单的模式来介绍主要概念。
假设首先A,B和C是strong引用,特别是C有一个strong引用指向其父对象。(某处),A引用不再存在,但由于obj 1和obj 2之间存在循环,因此存在泄漏。(仅用于解释目的),obj 1的保留计数为2(obj 2具有对其的strong引用),而obj 2具有保留计数1。如果obj 1被释放,它保留计数现在是1,且不调用它的dealloc方法。obj 1和obj 2仍然保留在内存中,但是没有人引用它们:泄漏
相反,如果只有A和B是strong refs,C符合weak,那么一切都没问题,没有泄漏。实际上,obj 1释放时,也会释放obj 2。从保留计数的Angular 讲,obj 1的保留计数为1,obj 2的保留计数为1。如果obj 1被释放,其保留计数现在为0,且调用其dealloc方法。obj 1和obj 2从内存中删除。

一个简单的建议:在处理ARC时,开始考虑对象图。

关于你的第一个问题,在处理XIB的时候,两种解决方案都是有效的,一般来说,在处理内存周期的时候都是使用weak引用,关于XIB文件,如果使用strong,需要在viewDidUnload中设置nil,因为如果不这样做,在内存不足的情况下,你可能会导致意想不到的泄漏。你不要在dealloc中释放它们,因为ARC会为你做。weak不需要这样的处理,因为当目标对象被销毁时,这些值会自动设置为nil。不再有悬空指针。
如果你有兴趣,我真的建议你阅读Mike Ashfriday-qa-2012-04-13-nib-memory-management
关于你的第二个问题,如果你需要支持iOS 4,而不是weak,你必须使用unsafe_unretained
在SO中有很多问题/答案。以下是主要的问题:
How do I replace weak references when using ARC and targeting iOS 4.0?
What kind of leaks does automatic reference counting in Objective-C not prevent or minimize?
using ARC, lifetime qualifier assign and unsafe_unretained
strong / weak / retain / unsafe_unretained / assign

更新

根据shaunlim的评论,从iOS 6开始viewDidUnload方法被弃用.在这里我真的建议看看Rob的答案:iOS 6 - viewDidUnload migrate to didReceiveMemoryWarning? .

zhte4eai

zhte4eai2#

对于通过IBOutlets连接到IB中对象的对象,可以使用weak,因为在这种情况下,只要超级视图存在,对象就会存在。这是因为超级视图有指向其子视图的强指针。
如果要定义的指针是指向对象的唯一指针,则应将其声明为强指针。
如果您是注册开发人员,我强烈建议您观看WWDC11和WWDC12的视频。另一个不错的资源是Stanford.的iOS开发播客

相关问题