虽然编码时总是出现有关 IBOutlet 保留计数的相同问题:从 NIB 取消归档对象后保留计数?何时对 IBOutlet 使用 @property?设置时保留还是分配? Mac 和 iPhone 之间的区别?
所以我读了The Nib Object Life Cycle来自苹果的文档。 Mac 和 iPhone 上的一些测试应用程序给了我一些奇怪的结果。尽管如此,我还是写下了一些如何处理这个问题的规则,以便在编码时保持快乐,但现在想向社区进行验证并听取您的意见和经验:
- 始终为顶级对象创建 IBOutlet。对于非顶级对象(如果需要)(需要访问)。
- 始终为 IBOutlet 提供如下属性(并在必要时释放它们!):
- Mac 上的顶级对象:
- @property(非原子,分配)IBOutlet SomeObject *someObject;
- @synthesize someObject;
- [self.someObject 释放];
- Mac 上的非顶级对象(无发布):
- @property(非原子,分配)IBOutlet NSWindow *window;
- @synthesize someObject;
- iPhone 上的顶级对象(必须保留):
- @property(非原子,保留)IBOutlet SomeObject *someObject;
- @synthesize someObject;
- [self.someObject 释放];
- iPhone 上的非顶级对象(应保留):
- @property(非原子,保留)IBOutlet UIWindow *window;
- @synthesize窗口;
- [self.window释放];
- Mac 上的顶级对象:
旁注:
- 在 Mac 和 iPhone 上, socket 连接是通过 setter (如果有)进行的。
- 顶级对象:“没有[...]拥有对象”
- 非顶级对象:“具有父对象或所属对象的任何对象,例如嵌套在 View 层次结构中的 View 。”
所以问题是:这是正确且良好的做法吗?
希望您能批准或更正。
最佳答案
始终让您的 Nib 的文件所有者是 NSWindowController 或 NSViewController(在 Mac OS X 上)或 UIViewController(在 iPhone 上)的子类,并使用 @property(保留)IBOutlet
为其所有 socket ,在 Controller 子类 -dealloc
方法中进行适当的释放。
此模式在 Mac OS X 和 iPhone 操作系统上都可以正常工作,因为 Mac OS X 上的 NSWindowController 和 NSViewController 为您获取顶级对象的隐式所有权(并在它们自己的 -dealloc
方法中放弃它),并且 iPhone OS 在 nib 加载期间不会为您获取顶级对象的任何隐式所有权。
关于iphone - 保留 IBOutlet 数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2097822/