IBOutlet声明?

fuz*_*oat 11 cocoa-touch objective-c

我已经看到下面的代码以3种不同的方式编写(关于IBOutlet)是否重要,我想说将IBOutlet添加到声明和@property都更简洁.

只是物业:

@class SwitchViewController;

@interface iPhone_switcherAppDelegate : NSObject <UIApplicationDelegate> {
    UIWindow *window;
    SwitchViewController *switchViewController;
}

@property(nonatomic, retain) IBOutlet UIWindow *window;
@property(nonatomic, retain) IBOutlet SwitchViewController *switchViewController;
@end
Run Code Online (Sandbox Code Playgroud)

只是声明:

@class SwitchViewController;

@interface iPhone_switcherAppDelegate : NSObject <UIApplicationDelegate> {
    IBOutlet UIWindow *window;
    IBOutlet SwitchViewController *switchViewController;
}

@property(nonatomic, retain) UIWindow *window;
@property(nonatomic, retain) SwitchViewController *switchViewController;
@end
Run Code Online (Sandbox Code Playgroud)

都:

@class SwitchViewController;

@interface iPhone_switcherAppDelegate : NSObject <UIApplicationDelegate> {
    IBOutlet UIWindow *window;
    IBOutlet SwitchViewController *switchViewController;
}

@property(nonatomic, retain) IBOutlet UIWindow *window;
@property(nonatomic, retain) IBOutlet SwitchViewController *switchViewController;
@end
Run Code Online (Sandbox Code Playgroud)

欢呼加里

Nik*_*uhe 11

IBOutlet只对InterfaceBuilder有用.对于编译器来说,UINibDeclarations.h #define就没什么了.

InterfaceBuilder IBOutlet从头文件中提取一个提示,列出该类的可用出口.如果将对象连接到a IBOutlet,无论是将其定义为属性还是实例变量,都会将此信息写入nib.

加载nib时,加载器会尝试找到设置连接的最佳方法:首先,它尝试查找具有适当名称的setter方法.如果没有找到这样的setter,它会回退到直接设置实例变量,这样的风格很差,因为内存管理并不是这样清楚的.

您提出的所有示例都有正确名称的属性(当然还有setter方法).因此,在每种情况下,无论IBOutlet标记位于何处,加载器都将使用setter方法:您的示例之间没有区别,无论是在nib中,还是在代码执行方式上.

最好的风格是将IBOutlet标记放入属性定义中.


die*_*ikh 7

无所谓.使用10.6 64位SDK,您还可以在没有ivar的情况下编写属性:

@class SwitchViewController;

@interface iPhone_switcherAppDelegate : NSObject <UIApplicationDelegate> {
}

@property(nonatomic, retain) IBOutlet UIWindow *window;
@property(nonatomic, retain) IBOutlet SwitchViewController *switchViewController;
@end
Run Code Online (Sandbox Code Playgroud)