2011-11-21 61 views
4

我有一個Objective-c類「MyClass」。在MyClass.m我有一個類擴展聲明一個CGFloat屬性:在類擴展中@property(nonatomic,只讀)和@property之間的區別?

@interface MyClass() 
@property (nonatomic) CGFloat myFloat; 
@end 

@implementation MyClass 
@synthesize myFloat; 
//... 
@end 

什麼變化時,使用readonly關鍵字聲明屬性(如果有的話)?

@interface MyClass() 
@property (nonatomic, readonly) CGFloat myFloat; 
@end 

@implementation MyClass 
@synthesize myFloat; 
//... 
@end 

也許,在第一種情況下,我可以說self.myFloat = 123.0;CGFloat f = self.myFloat;內MyClass的?然後,在第二種情況下,readonly關鍵字防止分配self.myFloat = 123.0;但允許讀CGFloat f = self.myFloat;

回答

11

選項readonly表示僅爲此屬性聲明getter方法。因此,沒有一個setter,它無法通過myObject.myFloat=0.5f;

修改如果你不聲明它readonly,這是read write默認。

通過()擴展聲明屬性不會修改訪問模式,但會修改範圍;它將是一個「私人」財產。

1

你說得對,聲明你財產readonly你告訴編譯器不能自動生成setter方法等self.myFloat = 123.0;將是非法的(除非你創造該方法手動)。

3

@synthesize使用@property定義來爲iVar生成適當的獲取器/設置器。當您指定readonly時,不會生成setter。這並不是嚴格執行的,因爲如果你選擇的話你可以自己編寫二進制文件(儘管這沒有多大意義)。

在類別中聲明屬性只是將該屬性的範圍定義爲屬於該類別。

相關問題