iphone - 什么时候用 self 访问属性,什么时候不访问?

标签 iphone objective-c ios self

谁能解释设置 someObject = someOtherObject;self.someObject = someOtherObject; 之间的区别,如果 someObject 是用 @property 创建的类属性(非原子,保留) SomeType someObject;

为了澄清我有类似的东西:

@interface SomeClass : NSObject {
   SomeType* someObject;
}

@property (nonatomic, retain) SomeType* someObject;

@end

我注意到,当我在没有 self 的情况下使用该属性时,有时会出现 EXC_BAD ACCESS,这看起来很随机。当我使用 self 时,我的程序会按应有的方式运行。当我跳过 self 时,我没有收到任何编译器错误或警告,所以我猜这是某种有效的语法?

最佳答案

self.someObject = someOtherObject 使用该属性。属性为您生成 setter 和 getter。在您的情况下,您将 retain 属性赋予属性,这意味着通过此属性设置的对象将自动接收 retain 消息,该消息将其保留计数增加 1。此外,成员变量的旧值被发送了一条 release 消息,减少了它的保留计数。

当对象的保留计数达到 0 时,对象将被释放。如果您尝试访问已释放的对象(例如,如果您尝试过于频繁地释放它),您会收到 EXC_BAD_ACCESS 异常。

在你的情况下:

SomeOtherObject *soo = [[SomeOtherObject alloc] init]; //retain count: 1
self.someObject = soo; //soo's retain count is now 2
[soo release]; //soo's retain count is 1 again, as self still uses it.
[self doSomethingWithSoo];

但是,如果不使用setter,则一定不要释放soo

SomeOtherObject *soo = [[SomeOtherObject alloc] init]; //retain count: 1
someObject = soo; //soo's retain count is still  1
[soo release]; //soo's retain count is 0, it will be deallocated
[self doSomethingWithSoo]; //will fail with an EXC_BAD_ACCESS exception, as soo does not exist anymore.

关于iphone - 什么时候用 self 访问属性,什么时候不访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4884231/

相关文章:

ios - 仅部分视频的 ScaleTimeRange

iphone - MKMapView 中的缩放级别

iphone - 使用核心数据在 View 中引用模型对象的最佳实践是什么?

ios - 以编程方式在iOS中获取自己的电话号码

objective-c - 打印 NSInteger 时出现奇怪的 BAD_ACCESS

objective-c - 为什么在 UITableViewCell 标识符中使用 static 关键字?

objective-c - 在类函数中使用@synchronized(self) { ... }

ios - Sinch关于relayRemotePushNotificationPayload :的澄清

ios - 存储不同 NSData 时 Realm 文件大小差异过大

iphone - iOS 5 的潜在(大概) future 使用趋势是什么?