2014-05-02 61 views
0

我經常在代碼中看到以不同方式使用實例變量,我不確定如何在objective-c中正確使用它們。例如,在下面的代碼中,我聲明屬性imagePicker,該屬性還創建底層實例變量_imagePicker如何在objective-c中正確使用實例變量?

@interface ViewController() 

@property (nonatomic, strong) UIImagePickerController *imagePicker; 

@end 

@implementation ViewController 


-(void)initVariables{ 


} 

什麼時候可以正確使用以下內容?我已經看到了代碼中使用的所有三種方式,但不瞭解使用它們的情況。

self._imagePicker = 

_imagePicker.property 

imagePicker.property 
+1

'self._imagePicker'有效嗎? –

回答

4

我不認爲任何您列出將工作的片斷......

self._imagePicker //Does not exists, it should be self.imagePicker 

_imagePicker.property //There is no property "property" in object of type UIImagePickerController 

//And the same error goes for your last example. 

我猜你已經看到了兩種方式很常見。 self.imagePicker_imagePicker。這兩個接入點做不同的事情,並在不同的情況下有用。

self.imagePicker =實際上調用[self setImagePicker:object]方法。如果您不手動創建此方法,則編譯器將爲您合成該方法。

_imagePicker =只是直接設置對象而不調用該方法。

所以這成爲一個問題是如果你實現自己的[self setImagePicker:]方法。在該方法中,您可以執行類似操作:

-(void)setImagePicker:(UIImagePickerController*)controller 
{ 
    self.imagePicker = controller; 
} 

此代碼非常糟糕。由於self.imagePicker =被編譯器更改爲[self setImagePicker:],因此您正在遞歸調用該方法至無止境。你的程序在那裏崩潰(經過100%cpu的使用並且沒有UI功能)。

-(void)setImagePicker:(UIImagePickerController*)controller 
{ 
    _imagePicker = controller; 
} 

我希望這說明了一點:相反,你應該當你寫的setter方法直接使用實例變量。

+0

我知道那些行不通,我用'財產作爲例子',我可以使用mediaTypes。謝謝你的回答,我現在明白了) – Michael

+0

那些是方法,而不是函數。而現代編譯器將不用'@ synthesize'合成屬性方法。 – jlehr

+0

爲了避免遞歸問題,我可以在'setImagePicker'方法內設置變量時簡單地使用'_imagePicker',對嗎? – Michael

相關問題