IBOutlet是否需要成为属性并合成?

War*_*ker 53 iphone interface-builder

在大多数示例中,我看到以下IBOutlets设置:



(Example A)

FooController.h:

@interface FooController : UIViewController {
    UILabel *fooLabel;
}

@property (nonatomic, retain) IBOutlet UILabel *fooLabel;

@end

FooController.m:

@implementation FooController

@synthesize fooLabel;

@end

Run Code Online (Sandbox Code Playgroud)

但这也很好(注意:没有属性也没有合成):



(Example B)

FooController.h:

@interface FooController : UIViewController {
    IBOutlet UILabel *fooLabel;
}

@end

FooController.m:

@implementation FooController

@end

Run Code Online (Sandbox Code Playgroud)

如例B中那样定义IBOutlets是否有任何缺点?像内存泄漏?似乎工作正常,我更喜欢不将IBOutlets公开为公共属性,因为它们不是这样使用的,它们仅用于控制器实现.在没有真正需要的情况下将它定义在三个地方并不会让我觉得非常干(不要重复自己).

Jon*_*ess 96

在Mac OS X上,IBOutlets连接如下:

  1. 查找名为set <OutletName>的方法:如果存在则调用它.
  2. 如果不存在任何方法,请查找名为<OutletName>的实例变量,将其设置为不保留.

在iPhone OS上,IBOutlets连接如下:

  1. call [object setValue:outletValue forKey:@"<OutletName>"]

key的set值的行为是这样的:

  1. 查找名为set <OutletName>的方法:如果存在则调用它.
  2. 如果不存在任何方法,请查找名为<OutletName>的实例变量,设置并保留它.

如果你使用一个属性,你将陷入两个平台上的" 寻找一个名为set <OutletName>:...的方法 "的情况.如果您只使用实例变量,那么您将在Mac OS X VS iPhone OS上具有不同的保留/释放行为.使用实例变量没有任何问题,您只需要在平台之间切换时处理这种行为差异.

这里是关于这个主题的完整文档的链接. https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/LoadingResources/CocoaNibs/CocoaNibs.html#//apple_ref/doc/uid/10000051i-CH4-SW6


Fre*_*man 12

在Mac OS X上,默认情况下不保留IBOutlet.这与iPhone OS上的行为相反:在iPhone OS上,如果您没有声明属性,则会保留该属性,您必须在dealloc方法中释放此属性.此外,64位运行时可以使用属性声明来合成实例变量.这意味着有一天IBOutlet可能会省略实例变量(带有).

由于这些原因,它更加同质和兼容,始终创建属性并IBOutlet仅使用属性中的属性.不幸的是,它也更冗长.

在您的第一个示例中,您始终必须在dealloc方法中释放插座.在第二个示例中,您必须仅使用iPhone OS释放插座.