保留IBOutlets的数量

Rap*_*aad 1 iphone macos cocoa objective-c nib

虽然编码总是与IBOutlets的保留计数相同的问题出现了:从NIB取消归档对象后保留计数?何时使用@ property's作为IBOutlet?设置时保留或分配?Mac和iPhone之间的差异?

所以我从Apple的文档中读到了The Nib Object Life Cycle.Mac和iPhone上的一些测试应用程序给了我一些奇怪的结果.不过我写了一些规则如何处理这个问题,以便在编码时保持快乐,但现在想要与社区核实并倾听您的​​意见和经验:

  1. 始终为顶级对象创建IBOutlet.对于非顶级对象(如果需要)(需要访问).
  2. 始终为IBOutlets提供如下属性(并在必要时释放它们):
    • Mac上的顶级对象:
      • @property(nonatomic ,assign)IBOutlet SomeObject*someObject;
      • @synthesize someObject;
      • [self.someObject release ];
    • Mac上的非顶级对象(无版本):
      • @property(nonatomic,assign)IBOutlet NSWindow*窗口;
      • @synthesize someObject;
    • iPhone上的顶级对象(必须保留):
      • @property(nonatomic ,retain)IBOutlet SomeObject*someObject;
      • @synthesize someObject;
      • [self.someObject release ];
    • iPhone上的非顶级对象(应该保留):
      • @property(非原子,保留)IBOutlet UIWindow*窗口;
      • @synthesize窗口;
      • [self.window 发布 ];

附注:

  • 在Mac和iPhone插座上,使用setter进行连接(如果可用).
  • 顶级对象:"拥有[...]没有拥有对象"
  • 非顶级对象:"具有父对象或拥有对象的任何对象,例如嵌套在视图层次结构中的视图."

所以问题是:这是正确和良好的做法吗?

我希望你能批准或纠正它.

Chr*_*son 10

总是让你 nibs'File 的Owner是NSWindowController或NSViewController(在Mac OS X上)或UIViewController(在iPhone上)的子类,并@property (retain) IBOutlet用于它的所有插座,在你的控制器子类-dealloc方法中做适当的发布.

这种模式在Mac OS X iPhone OS 上都能很好地工作,因为Mac OS X上的NSWindowController和NSViewController会为你隐藏所有顶级对象(并放弃它们自己的方法),而且iPhone OS不接受任何在笔尖加载期间为您隐式拥有顶级对象.-dealloc