2012-04-12 49 views
1

我對將屬性賦值給Objective-C存在疑問。我有很多的「misteriously錯過」的價值觀的問題,例如,如果我有這樣的接口:使用(或不使用)自我。在Objective-C屬性中

// MyClass.h 
@interface MyClass : NSObject { 
    MyOtherClass *myVar; 
} 

@property (nonatomic, retain) MyOtherClass *myVar; 

- (id)initWithValue:(NSString *)val; 

實施這一項目:

// MyClass.m 
@implementation MyClass 

@synthesize myVar; 

- (id)initWithValue:(NSString *)val { 
    self = [super init]; 

    if (self != nil) { 
     /** Do some stuff with val... **/ 
     myVar = [method:val]; // Some method that returns a MyOtherClass value 
    } 

    return self; 
} 

在執行的某一點,值myVar消失,變化或其他東西...而解決方案是改變:

myVar = [method:val]; //返回一個MyOtherClass值

自一些方法 .myVar = [方法:VAL]; //一些返回MyOtherClass值的方法

那麼......使用自我還是不使用它有什麼不同?我的意思是,很明顯,我已經使用它,因爲如果沒有它會造成問題,但我不知道爲什麼

預先感謝您

+0

[調用self.var VS變種之間的不同]的可能重複(http://stackoverflow.com/questions/4627646/difference-between-calling-self-var-vs-var) – 2012-04-12 21:18:07

回答

1

這是一個很好的例子,說明爲什麼你應該將@synthesize更改爲@synthesize myVar = _myVar;或其中的一些變化。如果沒有這樣做,可以將您的實例變量設置爲「myVar = nil」的直接分配將繞過您的setter。

使用myVar = _myVar策略將導致編譯器在您嘗試執行操作時發出抱怨myVar =,將需要向self.myVar將訪問您的setter或getter。

那麼你應該使用_myVar唯一的地方是,如果你改變你的setter或getter該變量的聲明。

+0

好,但我不同意最後一部分。在某些情況下,直接使用變量可能更合適。那些情況下,你a)需要擔心性能,因爲調用getter/setter是另一種方法調用或b)alloc/init一個對象並且想保存版本 – Ahti 2012-04-12 21:40:57

+1

是真的,但你只會注意到性能問題如果你反覆(很多很多很多次)非常緊張的循環呼叫你的二傳手或吸氣。 – 2012-04-12 21:44:31

3

如果您使用的自我,你正在使用的財產,它標有「保留」。如果您使用該變量,則繞過該屬性,因此不會「保留」。您可以編寫myVar = [[someObject method:val] retain];並獲得與該屬性相同的效果。

+1

這是否仍與正確弧? – Kyle 2014-02-03 12:26:58

0

有哪些方法你打電話val

我可以想象,當你做

myVar = [method:val]; // Some method that returns a MyOtherClass value 

結果是自動釋放的對象。這意味着當你的init方法完成時你的對象被釋放並被銷燬。變量仍然指向對象所在的內存位置,但該內存可能會填充任何內容。

當您使用屬性setter方法使用點語法像這樣

self.myVar = [method:val]; 

自動爲您編譯器合成的setter方法將發送對象保留信息,以保持它周圍。

您也可以治好你的代碼錯誤是這樣的:

myVar = [[method:val] retain]; // Some method that returns a MyOtherClass value 

但其更好地堅持點語法。

+0

現在,最好只是假設ARC,在這種情況下,這不是問題。 – 2012-04-12 21:22:59

+0

他們沒有使用ARC,因爲在ARC下不能使用屬性的'retain'關鍵字。如果他們使用ARC,則相應的關鍵字應該是'strong' – jackslash 2012-04-12 21:25:29

+0

我同意提交者可能會從ARC中受益,儘管 – jackslash 2012-04-12 21:25:47

相關問題