2011-12-19 18 views
26

Trước ARC, nếu tôi muốn có một tài sản để được readonly để sử dụng nó nhưng có nó có thể ghi trong lớp, tôi có thể làm:Objective-C ARC thuộc tính readonly và thực hiện setter tin

// Public declaration 
@interface SomeClass : NSObject 
    @property (nonatomic, retain, readonly) NSString *myProperty; 
@end 

// private interface declaration 
@interface SomeClass() 
- (void)setMyProperty:(NSString *)newValue; 
@end 

@implementation SomeClass 

- (void)setMyProperty:(NSString *)newValue 
{ 
    if (myProperty != newValue) { 
     [myProperty release]; 
     myProperty = [newValue retain]; 
    } 
} 
- (void)doSomethingPrivate 
{ 
    [self setMyProperty:@"some value that only this class can set"]; 
} 
@end 

Với ARC, nếu tôi muốn ghi đè lên setMyProperty, bạn không thể sử dụng từ khóa giữ lại/phát hành nữa, điều này có đầy đủ và chính xác không?

// interface declaration: 
@property (nonatomic, strong, readonly) NSString *myProperty; 

// Setter override 
- (void)setMyProperty:(NSString *)newValue 
{ 
    if (myProperty != newValue) { 
     myProperty = newValue; 
    } 
} 

Trả lời

62

Có, đó là đủ, nhưng bạn thậm chí không cần nhiều.

Bạn có thể làm

- (void)setMyProperty:(NSString *)newValue 
{ 
     myProperty = newValue; 
} 

Trình biên dịch sẽ làm điều đúng ở đây.

Điều khác là bạn thậm chí không cần điều đó. Trong tiện ích mở rộng lớp học, bạn có thể thực sự xác nhận các tuyên bố @property.

@interface SomeClass : NSObject 
@property (nonatomic, readonly, strong) NSString *myProperty; 
@end 

@interface SomeClass() 
@property (nonatomic, readwrite, strong) NSString *myProperty; 
@end 

Làm điều đó, bạn chỉ cần tổng hợp và bạn có trình thiết lập riêng được tổng hợp cho bạn.

+1

Cảm ơn Joshua - rất hữu ích! Tôi đã, kể từ đó, khó hiểu một điều cuối cùng. Đọc về các thay đổi ARC đối với các thuộc tính [ở đây] (http://tools.ietf.org/html/draft-pantos-http-live-streaming-08) dường như, theo mặc định, chúng được thực hiện bởi @synthesize với ** mạnh ** thay vì ** gán **. Trong trường hợp đó, vì lợi ích của việc làm sạch API công khai, không tốt nhất là chỉ định (nonatomic, readonly) vì không cần người dùng giao diện công khai quan tâm hoặc cần biết rằng, nội bộ, tài sản mạnh ? Hy vọng tôi có ý nghĩa ở đây. :) –

+0

Nó chỉ mạnh đối với các loại đối tượng, để giúp làm cho mọi thứ rõ ràng hơn, tôi vẫn muốn đặt 'strong',' weak' hoặc 'assign'. –

+0

Thực sự mạnh mẽ chỉ áp dụng cho các loại đối tượng nhưng câu hỏi vẫn còn là liệu API công khai của bạn (tức là tệp tiêu đề) có cần phải xuất bản chi tiết này hay không. Đó là điểm thực tôi đang truy vấn! –

6

Bạn có thể redeclare tài sản của bạn như readwrite trong phần mở rộng giao diện:

@interface SomeClass() 
@property (nonatomic, strong, readwrite) NSString *myProperty; 
@end 
Các vấn đề liên quan