ios - 保留分配和初始化计数

标签 ios objective-c cocoa-touch automatic-ref-counting

一些网站是这样说的:

@property (nonatomic, strong) MyObject *foo;

self.foo = [[MyObject alloc] init];

将保留计数增加到 2

但是自从最新的 xcode 版本或 ARC 以来,这应该不是问题,对吧?

根据视频我们可以取出所有autorelease

因此:

@property (nonatomic, strong) MyObject *foo;

self.foo = [[[MyObject alloc] init] autorelease];

变成这样

@property (nonatomic, strong) MyObject *foo;

self.foo = [[MyObject alloc] init];

那么我应该忽略那个网站,上面写着 self.foo = [[MyObject alloc] init]; 将保留计数增加到 2?

最佳答案

如果没有 ARC,您可能应该使用 retain (以及相应的 assign)而不是 strong (和 weak >)。在第一个示例中,没有 ARC,- init 方法返回一个保留计数为 1 的对象,并且 foo 属性的 setter 将保留计数增加到 2。

在第二个示例中(必须没有 ARC,因为 autorelease 不适用于 ARC),- autorelease 调用将对象添加到自动释放池中,并且将其保留计数减少 1,因此该对象最终的保留计数为 1(对于该属性)。

使用 ARC,如第三个示例所示,您根本不需要担心保留计数 - 这就是 ARC 的要点。在幕后,- init 仍应返回一个保留计数为 1 的对象,并且 foo 的 setter 仍应增加保留计数,但编译器应插入一个-release 在 setter 被调用之后的某个地方。基本上,使用 ARC,因为该属性是strong,一旦将其分配给该属性,您就可以依赖该对象继续存在,并且不必考虑retain /发布/自动释放

关于ios - 保留分配和初始化计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15581598/

相关文章:

iphone - MKCoordinateRegion 没有以正确的方式显示在 map 上

ios - CMPedometerData 中的结束日期不正确

cocoa-touch - 第二个 UIWindow 不显示 (iPad)

ios - RestKit NSFetchRequest block 用于删除孤立对象

ios - 由于未捕获的异常而终止应用程序。 "nil string parameter"

ios - UICollectionView 委托(delegate)方法的问题

objective-c - 当应用程序最小化并再次回到前台时,会调用哪个方法?

iphone - 如何连接 nsstring url

ios - 自定义 UITableView 适当更新每个标签和 UIImage,除了一个 - 使用 Core Data 和 NSFetchedResultsController

iOS 存储文件规则 - 在 iOS 应用程序上存储音频文件