说Getter是实例变量的所有者是否有效?或谁拥有它?

时间:2009-04-29 21:28:35

标签: objective-c cocoa cocoa-touch uikit

其实我会说:是的,Getter是主人。因此,任何调用Getter的人都不负责释放内存。或者更确切地说,对象本身是所有者,但Getter充当实例变量的传递机制给其他人。这是对的,还是我弄错了?

4 个答案:

答案 0 :(得分:5)

谈论对象更有意义,而不是拥有对象的方法。

通常,调用getter的对象是被返回对象的所有者,因为返回值是一个实例变量:

  • (Foo *)foo { return _foo; //我的实例变量 }

但是,getter创建一个已自动释放的临时对象并返回它也很常见:

  • (NSString *)sizeStr { return [NSString stringWithFormat:@“%d”,self.size]; }

在这种情况下,该对象(NSString)实际上没有所有者,除了当前的自动释放池,它将在退出时释放它。

在(非GC)Cocoa编程中要记住的重要规则与所有权本身没有关系,但是当你有一个对象的引用时(你必须在某个时候发布)和当你不这样做时。

答案 1 :(得分:1)

因为你问的是使用引用计数系统的Cocoa,所以没有“所有者”这样的东西。每个有保留参考的人都是部分所有者,负责发布他们的参考资料。释放最后一个引用时,将释放该对象。

按照惯例,getter不会给调用者一个保留引用,但这并不意味着调用者不能选择显式保留一个对象。

答案 2 :(得分:0)

基本上你是对的,但它只是一个惯例问题。只要你的公约得到一贯的应用,并且每个参与该项目的人都同意这一点,那么你就是金色的。

如果调用者缓存指向某个内存的指针,它会从访问器中获取,然后该对象被破坏,现在指针悬空。

答案 3 :(得分:0)

取决于。

您应该决定对象所有权政策。但一般来说,如果一个对象是另一个对象的子对象(成员),那么它所属的对象就会对其生命周期负责,并且(通常)将其清理为它的析构函数。

通常不赞成将调用者清理的内存分发出来。在C中,必须为调用者分配内存的库(例如,X Windows libs或数据库客户端的C API)将分发一个不透明的指针,调用者必须通过调用另一个库函数来销毁它:

 Window foo = APIcreateWindow();
 APIsetupWindow(foo, x, y, z );
 AOIshowWindow(foo);
 APIdestroyWindow(foo);  //forgetting to call this leaks memory

在那个(假设的)代码中,Window实际上是指向struct的指针的typedef;在执行其他API簿记后,APICreateWindow为结构分配了内存,APIdestroyWindow调用了它。

在C ++中,我们可能会交回一个智能指针,当没有其他任何内容引用时它会自行销毁。