以下两种分配和初始化对象的方法有什么区别?

AController *tempAController = [[AController alloc] init];
self.aController = tempAController;
[tempAController release];

self.aController= [[AController alloc] init];

Most of the apple example use the first method. Why would you allocate, init 和 object 和 then release immediately?

推荐答案

每个对象都有一个引用计数.当它变为0时,对象被解除分配.

假设财产申报为@property (retain):

你的第一个例子,逐行:

  1. 对象由alloc创建,其引用计数为1.
  2. 对象被交给selfsetAController:方法,该方法向其发送retain消息(因为该方法不知道对象来自何处),将其引用计数增加到2.
  3. 调用代码不再需要对象本身,因此它调用release,将引用计数减少到1.

第二个示例基本上执行了步骤1和2,但没有执行步骤3,因此最后对象的引用计数为2.

规则是,如果你创建了一个对象,你有责任在完成后释放它.在您的示例中,代码在设置属性后使用TempaControl完成.如果setter方法需要该对象保持不变,则它有责任调用retain.

重要的是要记住,Objective-C中的self.property = foo;实际上只是[self setProperty:foo];的简写,setProperty:方法将根据需要保留或复制对象.

如果属性被声明为@property (copy),那么对象将被复制而不是保留.在第一个示例中,原始对象将立即释放;在第二个示例中,原始对象的引用计数将为1,即使它应该为0.因此,您仍然希望以相同的方式编写代码.

如果该财产被宣布为@property (assign),那么self并没有声称拥有该物品,其他人需要保留它.在这种情况下,第一个例子是不正确的.这类属性很少见,通常只用于对象委托.

Objective-c相关问答推荐

Apple Silicon 上的 dispatch_time 计算失败

覆盖@property setter 和无限循环

使用 NSMutableString 附加到文件的末尾

uipageviewcontroller 类在设置多个视图控制器时崩溃

TWTweetComposeViewController 在 IOS6 中已弃用

使用 AVAudioplayer 在后台播放音乐

NSBundle pathForResource 为 NULL

可供学习的 iOS 示例项目

UIButton 标题更改为默认值

Asihttprequest 61 错误

当前时间是 HH:MM:SS am/pm 格式吗?

在可可中的字符串上使用 MD5 哈希?

在 ARC 中清零弱引用

如何将当前方法的名称或签名放入 NSString?

didReceiveRemoteNotification:当应用程序处于后台并且未连接到Xcode时未调用fetchCompletionHandler

Apple 的 API 中的k前缀表示什么?

如何从 CGPoint 和 CGSize 创建 CGRect?

UITableViewCell 点击展开

发送通知到山狮通知中心

如何在 iOS 中创建自定义 UIActivity?