其实我会说:是的,Getter是老板。所以任何调用Getter的人都不负责释放内存。或者更准确地说,对象本身就是所有者,但Getter充当其他实例变量的传递机制。这是对的,还是我弄错了?是否可以说Getter是实例变量的所有者?或谁拥有它?
回答
基本上你是正确的,但它只是一个约定的问题。只要您的惯例得到一致的应用,并且从事该项目的每个人都同意这一点,那么您就是金。
在那里你可能会遇到麻烦是,如果呼叫者缓存的指针,一些内存从一个访问获得,然后该对象被破坏,现在指针晃来晃去。
这是一般的合理答案,但它不适用于使用引用计数的Objective-C对象。 – 2009-04-29 23:44:10
这取决于。
您应该决定对象所有权策略。但是一般来说,如果一个对象是另一个对象的一个子对象(成员),它所属的对象负责其一生,并且(通常)将它清理到它的析构函数中。
端出存储器被清洗机由呼叫者通常不赞成。在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++中,我们可能交回智能指针,是破坏自己在没有其他引用它。
既然你问可可,它使用引用计数系统,有作为“的”老板没有这样的事。每个有保留参考的人都是部分所有者,负责释放他们的参考。当最后一个参考被释放时,对象被解除分配。
它是按照惯例干将不给调用者保持引用的情况,但这并不意味着呼叫者可以选择不明确保留的对象。
更有意义谈论对象,而不是方法,拥有的对象。
常常,吸气剂被称为所述对象是正在返回的对象的所有者,因为返回值是一个实例变量:
- (美孚*)FOO { 返回_foo; //我的实例变量 }
然而,这也是常见的getter打造了被自动释放一个临时对象,并返回它:
- (的NSString *)sizeStr { 回报[的NSString stringWithFormat:@“%d”,self。尺寸]; }
在这种情况下,该对象(NSString的)并没有真正有一个老板,也许除了当前autorelease池,它退出时将其释放。
在(非GC)Cocoa编程中要记住的重要规则并不是与所有权本身有关,而是当你有一个对象的引用(你必须在某个时候发布)当你不这样做。
- 1. 是否有必要在UITableViewCell子类中拥有实例变量?
- 2. 是否可以拥有财产,可以是或虚假或数组或空
- 3. 是否可以有多个iAds实例?
- 4. C和C++的所有者是谁?
- 5. 是否可以迭代JavaScript伪类的所有实例?
- 6. JMS主题是否可以拥有多个发布者
- 7. 不能与谁拥有它
- 8. GitHub组织所有者是否可以移除其他所有者?
- 9. 谁拥有IErrorInfo的所有权?
- 10. QToolBox是否拥有它的物品?
- 11. 是否可以从外部修改类实例的私有变量?
- 12. 是否有可能拥有多个PyPlot窗口?或者我仅限于子图?
- 13. PHP if语句是否可以包含所有变量?
- 14. 变量可以被一个类的所有实例访问
- 15. 实例变量是否可以在类的底部声明?
- 16. 我可以告诉一个文件是否由本地宏打开 - 或者,我可以找到谁是实例化文件的调用者或父母?
- 17. Java或Ruby,它是否有所作为?
- 18. 是否有可能拥有DRM软件的开源实现?
- 19. 方法体中是否有静态变量由所有实例共享
- 20. 是否可以在运行时确定谁拥有一段动态内存?
- 21. 如何找出脚本拥有者是谁?
- 22. QTimer实例是否有最大数量?
- 23. 在Ruby中是否有这样一个常量实例变量?
- 24. 是否可以更改封闭的所有者?
- 25. Flash是否仅编译需要的内容?或者它总是“重建所有”?
- 26. 是否可以通过静态方法访问实例变量?
- 27. PostgreSQL数据库可以拥有的表的数量是否有限制?
- 28. 为类变量赋值是为该对象的所有实例指定它
- 29. 是否有可能拥有“仅实现”类成员?
- 30. 使用getter访问私有实例变量是否是一种很好的编码习惯
所有权意味着负责在不再需要时释放它。这通常在类的dealloc()中完成,而不是在getter中完成。 我想你有一个不同的所有权定义。你能澄清吗? – thesamet 2009-04-29 21:34:40
当提问这样的问题时,你应该在问题的文本中说清楚你正在问Cocoa,否则你会得到很多误导性的答案(像这里的一些答案),这些答案都是关于非引用语言的。 – smorgan 2009-04-29 22:00:45