2009-04-29 77 views
-1

其实我会说:是的,Getter是老板。所以任何调用Getter的人都不负责释放内存。或者更准确地说,对象本身就是所有者,但Getter充当其他实例变量的传递机制。这是对的,还是我弄错了?是否可以说Getter是实例变量的所有者?或谁拥有它?

+0

所有权意味着负责在不再需要时释放它。这通常在类的dealloc()中完成,而不是在getter中完成。 我想你有一个不同的所有权定义。你能澄清吗? – thesamet 2009-04-29 21:34:40

+0

当提问这样的问题时,你应该在问题的文本中说清楚你正在问Cocoa,否则你会得到很多误导性的答案(像这里的一些答案),这些答案都是关于非引用语言的。 – smorgan 2009-04-29 22:00:45

回答

0

基本上你是正确的,但它只是一个约定的问题。只要您的惯例得到一致的应用,并且从事该项目的每个人都同意这一点,那么您就是金。

在那里你可能会遇到麻烦是,如果呼叫者缓存的指针,一些内存从一个访问获得,然后该对象被破坏,现在指针晃来晃去。

+1

这是一般的合理答案,但它不适用于使用引用计数的Objective-C对象。 – 2009-04-29 23:44:10

0

这取决于。

您应该决定对象所有权策略。但是一般来说,如果一个对象是另一个对象的一个​​子对象(成员),它所属的对象负责其一生,并且(通常)将它清理到它的析构函数中。

端出存储器被清洗机由呼叫者通常不赞成。在C中,必须为调用者分配内存的库(例如X Windows库或用于数据库客户端的C API)将发出一个不透明指针,该指针必须由调用者通过调用另一个库函数而销毁:

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

在这(假设的)码,Window实际上是一个指向struct一个typedef; APICreateWindow为结构分配内存,APIdestroyWindow在调用其他API记账后对其进行免费调用。

在C++中,我们可能交回智能指针,是破坏自己在没有其他引用它。

1

既然你问可可,它使用引用计数系统,有作为“的”老板没有这样的事。每个有保留参考的人都是部分所有者,负责释放他们的参考。当最后一个参考被释放时,对象被解除分配。

它是按照惯例干将不给调用者保持引用的情况,但这并不意味着呼叫者可以选择不明确保留的对象。

5

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

常常,吸气剂被称为所述对象是正在返回的对象的所有者,因为返回值是一个实例变量:

  • (美孚*)FOO { 返回_foo; //我的实例变量 }

然而,这也是常见的getter打造了被自动释放一个临时对象,并返回它:

  • (的NSString *)sizeStr { 回报[的NSString stringWithFormat:@“%d”,self。尺寸]; }

在这种情况下,该对象(NSString的)并没有真正有一个老板,也许除了当前autorelease池,它退出时将其释放。

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

相关问题