委托案例中不同属性声明之间的区别

时间:2014-05-19 09:45:40

标签: ios objective-c

谁能告诉我三个属性的属性有什么区别。我在谷歌搜索但没有得到任何满意的答案。 还请告诉我哪个是最好的选择,为什么?

@property (nonatomic, strong) id <GameAddViewControllerDelegate> delegate;
@property (nonatomic, weak) id <GameAddViewControllerDelegate> delegate;
@property (nonatomic, assign) id <GameAddViewControllerDelegate> delegate;

3 个答案:

答案 0 :(得分:2)

区别与strong, weak and assign说明符相同。

需要注意的要点:任何对象都不会保留代理人。因此,不应使用strongretain

允许使用

weakassign,甚至可以使用unsafe_unretained

Why not to use retain?

Why use weak or assign?

答案 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声明utilityObjectdelegate属性,则self现在保留self.utilityObject并且self.utilityObjec t保留自己。

Also see this detailed answer on stackoverflow