2014-07-06 69 views
1

我很困惑,我需要一些幫助。我覺得我做了瞭解基本的@財產/ @合成 我有一個自定義視圖控制器類和我在,H文件如下聲明:困惑於@property和@synthesize如何在iOS 7中工作

@property (nonatomic) NSMutableArray *milestoneViews; 

而不是使用@synthesize,我試圖用我自己的getter和setter ...

所以,我創建了.m文件下面的函數 -

-(NSMutableArray*) milestoneViews{ 
    if (_milestoneViews == nil) { 
     _milestoneViews = [[NSMutableArray alloc]init]; 
    } 
    return _milestoneViews; 
} 

它編譯罰款。但是當我開始寫這樣的setter:

-(void) setMilestoneViews:(NSMutableArray*) array 
{...} 

我得到了_milestoneViews的所有引用編譯錯誤。

我錯過了什麼?

+0

不要覺得不好混淆。有時,蘋果公司似乎每六個月會改變一次工作方式(儘管我認爲這更像每18個月一次)。 –

回答

0

當編譯器通過手寫getter或手寫setter看到讀/寫屬性時,它會爲您合成一個支持實例變量。但是,當它檢測到都是這個手寫的getter和一個手寫的setter時,它決定既然你已經實現了這兩種方法,它就不需要綜合任何東西。

這意味着如果您希望手動編寫getter和setter,則需要將自己的實例變量添加到類中。通常情況下,你這樣做,在一個類擴展或@implementation塊,到報關私人存到自己的實現:

@interface MyClass() { 
//    ^^ 
//    || 
//  Marks the extension 

    NSMutableArray *_milestoneViews; 

} 
+0

僅供參考 - 您不需要爲此擴展類。我總是將我的ivars添加到'@ implementation'塊。要麼工作。 – rmaddy