谁能告诉我三个属性的属性有什么区别。我在谷歌搜索但没有得到任何满意的答案。 还请告诉我哪个是最好的选择,为什么?
@property (nonatomic, strong) id <GameAddViewControllerDelegate> delegate;
@property (nonatomic, weak) id <GameAddViewControllerDelegate> delegate;
@property (nonatomic, assign) id <GameAddViewControllerDelegate> delegate;
答案 0 :(得分:2)
区别与strong
, weak
and assign
说明符相同。
需要注意的要点:任何对象都不会保留代理人。因此,不应使用strong
和retain
。
weak
和assign
,甚至可以使用unsafe_unretained
。
答案 1 :(得分:2)
<强>弱强>
weak适用于委托对象(具有引用计数和 所有的东西),但弱的参考不会增加refcount。但有一次 委托对象被解除分配(从代码中的任何地方),任何 对该对象的弱引用设置为nil。这非常有用, 因为如果你只使用强弱参考,你就无法结束 使用无效指针(指向已经解除分配的对象的指针)。
指定强>
assign通常用于int,float和其他非对象类型。 您当然可以为这样的变量分配对象引用,但是 如果对象被释放,你仍然会有一个指向它的指针 记忆(现在是垃圾,使用时会伤到你)。
<强>强强>
Strong会将对象保留在堆中,直到它不指向它为止 了。换句话说&#34;我是主人,你不能解除这个 在我和保留之前一样好的时候#34;只有你才使用强 需要保留对象。
如果是委托,弱选择
答案 2 :(得分:0)
您通常希望分配代理而不是保留它们,以避免循环保留计数,其中对象A保留对象B并且对象B保留对象A.(您可能会看到这被称为保留&#34;弱引用& #34;代表。)例如,考虑以下常见模式:
-(void)someMethod {
self.utilityObject = [[[Bar alloc] init] autorelease];
self.utilityObject.delegate = self;
[self.utilityObject doSomeWork];
}
如果使用retain声明utilityObject
和delegate
属性,则self现在保留self.utilityObject
并且self.utilityObjec
t保留自己。