2010-02-05 27 views
11

Tôi đã nhìn thấy đoạn code dưới đây được viết 3 cách khác nhau (liên quan đến IBOutlet) Có vấn đề gì không, tôi có thể nói thêm IBOutlet cho cả khai báo và @property ngắn gọn hơn.Khai báo IBOutlet?

JUST SỞ HỮU:

@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 KÊ KHAI:

@class SwitchViewController; 

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

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

CẢ:

@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 

cổ vũ gary

+0

@fuzzygoat: +1 Đã có cùng một câu hỏi trong đầu, và ở đây là vậy. –

Trả lời

7

Không nên quan trọng. Với SDK 64 bit 10.6, bạn cũng có thể viết thuộc tính mà không có ivar:

@class SwitchViewController; 

@interface iPhone_switcherAppDelegate : NSObject <UIApplicationDelegate> { 
} 

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

IBOutlet không quan trọng đối với InterfaceBuilder. Đối với trình biên dịch, UINibDeclarations.h #define không có gì.

InterfaceBuilder mất IBOutlet làm gợi ý từ tệp tiêu đề để liệt kê các cửa hàng có sẵn cho lớp học. Nếu bạn kết nối một đối tượng với một số IBOutlet, bất kể nó được định nghĩa là biến thuộc tính hay biến mẫu, thông tin này được ghi vào nib.

Khi tải ngòi, bộ tải sẽ cố gắng tìm cách tốt nhất có thể để thiết lập kết nối: Đầu tiên, nó cố gắng tìm phương thức setter với tên thích hợp. Nếu không có setter như vậy được tìm thấy, nó rơi trở lại để thiết lập các biến cá thể trực tiếp, đó là phong cách nghèo, bởi vì quản lý bộ nhớ không rõ ràng theo cách này.

Tất cả các ví dụ được đề xuất của bạn đều có thuộc tính (và, tất nhiên, một phương thức setter) của tên đúng. Vì vậy, trong mỗi trường hợp, trình tải sẽ sử dụng phương thức setter, bất kể vị trí của thẻ IBOutlet: Không có sự khác biệt giữa các ví dụ của bạn, không phải trong nib, cũng như cách mã được thực thi.

Cách tốt nhất là đặt thẻ IBOutlet vào định nghĩa thuộc tính.

3

Kiểu hiện tại trong mã ví dụ của Apple đặt IBOutlet trong khai báo thuộc tính. Để nhất quán, đó có lẽ là nơi tốt nhất để ném nó.

0

Tôi cũng thấy cách này (không có bất kỳ kê khai tài sản):

@class SwitchViewController; 

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

@end 

gì về điều này?

+0

Giống như Nikolai nói thêm, điều này sẽ làm cho bộ nạp Nib thiết lập biến cá thể trực tiếp, mà không thông qua phương thức setter, nghĩa là lớp của bạn không còn quản lý bộ nhớ của các biến này nữa (mã của bạn không bao giờ "giữ lại"). Tạo các trình truy cập thuộc tính để đảm bảo các cá thể được giữ lại và phát hành đúng cách. –

+2

Nhận xét cuối cùng này vẫn được cập nhật với ARC? –