我该如何确定是保留还是分配一个属性?

33

有没有一些好的规则可以学习,来决定何时使用retain,何时使用assign?


3
下面的回答非常好。如果您能将其中一个标记为已接受,那就太好了。 - memmons
4个回答

53

Assign关键字通常用于原始值类型,如BOOL、NSInteger或double。对于对象,请使用retain或copy,具体取决于您想保留原始对象的引用还是创建对象的副本。

唯一的例外是在需要保留指向对象的指针但由于引用循环而无法使用retain时,应该使用弱引用。一个例子是委托模式,其中一个对象(例如表视图)保持对其代理的指针。由于代理对象保留了表视图,让表视图保留代理会导致它们两个都永远不会释放。在这种情况下,应该使用弱引用。在创建属性时,您应该使用assign关键字。


4

4
我认为在使用对象时,你几乎总是会使用retain而不是assign,在处理原始类型、结构体等时,则会使用assign(因为无法保留非对象)。这是因为你要让拥有该属性的对象决定何时完成对象,而不是其他东西。苹果的内存管理指南阐述如下:
“有时您不希望接收到的对象被处置;例如,您可能需要将对象缓存在实例变量中。在这种情况下,只有您知道何时不再需要该对象,因此,您需要确保在您仍在使用它时不会处理该对象。通过发送一个retain消息,您可以确保该对象不会在您使用它时被释放。retain消息取消挂起的自动释放(或者预先阻止了后续的release或autorelease消息)”。
关于使用copy和retain的讨论,请参见这个SO问题

0
如果您打算保留对象并使用它,请使用retain。否则,它可能会被释放,导致代码出现错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接