[ios]当访问属性与自我和当不到吗?

发布时间: 2017/3/21 23:08:19
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

任何人都可以解释设置区别 someObject = someOtherObject;self.someObject = someOtherObject; 如果 someObject 是用 @property 创建一个类属性 (非原子,保留) SomeType someObject;

为了澄清我有某种东西像︰

@interface SomeClass : NSObject {
   SomeType* someObject;
}

@property (nonatomic, retain) SomeType* someObject;

@end

我注意到当我使用无自我的属性,它看起来很随机,我有时候会 EXC_BAD 访问。当我使用自我我的程序作为它应该是。我不要任何编译器错误或警告时我跳过自我,所以我猜它某种程度上是有效的语法吗?

解决方法 1:

属性是只是方便地访问数据。所以,当您声明的属性 @property (非原子,保留) SomeType * someObject; 这意味着,在访问期间会合成 2 种方法︰

吸气剂︰

-(SomeType*) someObject {
   return someObject;
}

二传手

-(void) setSomeObject:(SomeType*) obj {
   [someObject release];
   someObject = [obj retain];
}

所以的主要区别性质和高德那属性动态创建的 setter/getter 方法 (和你可以重写它们)。但是,当你写 someObject = new_val,你只复制引用到的内存位置。不做任何额外的工作有一个程序集指令除外。

还有一件事要提︰ 原子和非原子。 与原子,合成的 setter/getter 将确保整个价值是总是从 getter 返回或设置由二传手,无论在任何其他线程上的二传手activity。那就是,如果线程 A 正处于吸气,而线程 B 调用 setter,实际可行的价值 — — 一个 autoreleased 对象,最有可能 — — 将返回给调用者。

在非原子,没有这样的保证了。因此,非原子是远远快于原子的。

编辑︰ 所以如果你有一些变量,这从不同线程访问或 / 和一些额外的工作必须要做 (例如保留,提高一些旗......),然后你的选择是属性。但有时你只有一个变量,很经常访问和通过属性访问可以导致很大的开销,因为处理器以执行更多操作合成和调用方法。

赞助商