2012-07-03 33 views
11

Tôi có giao diện lớp sau:ObjectiveC: nơi khai báo các đặc tính cá nhân?

@interface MyClass : NSObject 

@property int publicProperty; 

@end 

sau đó thực hiện:

@interface MyClass() // class extension 

- (void)privateMethod; // private methods 

@end 

@implementation MyClass { 
    int _privateProperty; 
} 

@property int privateProperty = _privateProperty; 

@end 

đây là những gì anh chàng của Apple cho thấy trong WWDC, nhưng có bất kỳ lý do để không đặt _privateProperty trong phần mở rộng lớp như :

@interface MyClass() // class extension 
{ 
    int _privateProperty; 
} 

- (void)privateMethod; // private methods 

@end 

Cảm ơn!

+0

Bạn có thể tìm thấy nhiều câu trả lời tốt cho câu hỏi của bạn ở đây: http://stackoverflow.com/search?q=private+property – Monolo

+0

dup có thể licate of [Làm thế nào để làm cho một tài sản tư nhân?] (http://stackoverflow.com/questions/2768750/how-to-make-a-private-property) – Monolo

Trả lời

5

Bạn không cần phải tuyên bố ivars của bạn trong cả giao diện và implementation.Because bạn muốn làm cho họ tin bạn chỉ có thể tuyên bố chúng trong tập tin thực hiện như sau:

Nếu bạn muốn, bạn có thể tạo phương thức getter và setter để bạn có thể truy cập các biến đó.

Người bạn đã nói chuyện đúng, nghĩ rằng không có lý do nào khiến bạn KHÔNG khai báo theo cùng một cách trên giao diện. Một số cuốn sách thực sự dạy cho bạn rằng @interface hiển thị khuôn mặt công khai của lớp và những gì bạn có trong quá trình triển khai sẽ là riêng tư.

0

Bạn có nghĩa là bạn muốn khai báo biến cá thể không?

Bạn có thể làm điều này:

@interface MyClass() 
{ 
@private //makes the following ivar private 
    int _privateProperty; 
} 
+0

Có nhưng tôi không muốn làm cho nó ivar, nó chỉ là một thuộc tính có thể được truy cập bởi self.privateProperty bằng cách sử dụng accessor và không được hiển thị trong @interface. – hzxu

+0

Bạn không thể thực hiện điều này bằng '@property int privateProperty = _privateProperty;', bạn phải thực hiện nó trong tệp triển khai. –

0

Với "thời gian chạy hiện đại" (64-bit MacOS sau 10.5 và tất cả các phiên bản iOS), bạn không cần phải khai báo các biến mẫu.

// MyClass.h 
@interface MyClass : NSObject 

@property int publicProperty; 

@end 


// MyClass.m 
@implementation MyClass 

@synthesize publicProperty = _privateProperty; // int _privateProperty is automatically synthesized for you. 

@end 
9

Tôi thường "buộc" riêng với một phần mở rộng trong việc thực hiện

Trong tiêu đề

@interface MyClass : NSObject 
{ 
} 

@property (nonatomic, assign) int publicProperty; 

@end 

của bạn Trong tập tin thực thi của bạn:

@interface MyClass() 
@property (nonatomic, assign) int privateProperty; 
@end 


@implementation MyClass 
@synthesize privateProperty; 
@synthesize publicProperty; 

@end 
Các vấn đề liên quan