谁能解释设置 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/