– (void)setMainSprocket:(Sprocket *)newSprocket {
[mainSprocket autorelease];
mainSprocket = [newSprocket retain]; /* Claim the new Sprocket. */
return;
}
现在 , setMainSprocket: 可能在被调用时带一个 Sprocket 对象的参数 , 而调用者想要保留该 Sprocket 对象 , 这意味着您的
对象将与其他对象共享 Sprocket 。如果有其他对象修改了 Sprocket ,您的对象的 main Sprocket 也会发生变化。但如果您 的
Thingamajig 需要有属于它自己的 Sprocket , 您可能会认为该方法应该复制一份私有的副本 ( 您应该记得复制也会得到所有权 ) :
– (void)setMainSprocket:(Sprocket *)newSprocket {
[mainSprocket autorelease];
mainSprocket = [newSprocket copy]; /* Make a private copy. */
return;
}
以上几种实现方法都会自动释放原来的 main sprocket 。如果 newSprocket 和 mainSprocket 是同一个的对象,并 且
Thingamajig 对象是它的唯一所有者的话,这样做可以避免一个可能出现的问题:在这种情况下,当 sprocket 被释放时,它会
被立即回收,这样一旦它被保留或复制,就会导致错误。下面的实现也解决了这个问题:
– (void)setMainSprocket:(Sprocket *)newSprocket {
if (mainSprocket != newSprocket) {
[mainSprocket release];
mainSprocket = [newSprocket retain]; /* Or copy, if appropriate. */
}
}
在所有这些情况中 , 看起来好像最终为您的对象设置的
mainSprocket
泄漏了 , 因为您不用释放对它的所有权 。 这些由
deallo c
方法负责,在
“
回收对象
”
部分进行了介绍。
“
存取方法
”
部分更详细地描述了存取方法及其实现。