IBOutlet声明?

时间:2010-02-05 11:50:14

标签: objective-c cocoa-touch

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

JUST 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

JUST DECLARATION:

@class SwitchViewController;

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

@property(nonatomic, retain) UIWindow *window;
@property(nonatomic, retain) SwitchViewController *switchViewController;
@end

BOTH:

@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
欢呼加里

4 个答案:

答案 0 :(得分:11)

IBOutlet只对InterfaceBuilder有用。对于编译器,UINibDeclarations.h #define没什么。

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

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

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

最好的方式是将IBOutlet标记放入属性定义中。

答案 1 :(得分: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

答案 2 :(得分:3)

Apple示例代码中的当前样式将IBOutlet放在属性声明中。为了保持一致性,这可能是抛出它的最佳位置。

答案 3 :(得分:0)

我也发现了这种方式(没有任何属性声明):

@class SwitchViewController;

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

@end

这个怎么样?