2013-10-01 44 views
2

在目標C中,它以懶惰的方式實例化內部類數組(等等)的慣例。在客觀C懶惰的實例中,爲什麼我們不接觸setter?

因此,如果您調用getter,它首先會檢查數組是否不爲零,並根據需要爲其分配內存。

二傳手? 如果您嘗試向某個數組單元格中插入某個值,,因爲我們尚未爲其分配內存 - 它在哪裏去?

我很想念這裏的東西,很清楚。將很高興澄清。

+1

如果您有數組一個二傳手,你爲什麼要擔心它是否已初始化?預計可以交給實際iVar的值是一個有效的數組或無。 – CodaFi

回答

3

我不知道我理解你的問題,但如果你這樣做:

@property (nonatomic, strong) NSMutableArray* myArray; 
... 

- (NSMutableArray *) myArray { 
    if(!_myArray) { 
     NSLog(@"created"); 
     _myArray = [[NSMutableArray alloc] init]; 
    } 

    return _myArray; 
} 

... 
[self.myArray addObject:@"test"]; 

吸氣,當你調用addObject:實際上是獲取調用,所以你會看到「創造」被記錄。

3

所以@property聲明是語法糖,用於在對象的情況下聲明指向實例變量的指針。 「nonatomic」是指自動創建的getter和setter類型(在這種情況下,「非線程安全」)。「strong」是ARC增加變量保留計數的指示符。

所以,當你聲明:

@property (nonatomic, strong) NSMutableArray* myArray; 

這是真正得到你的班上創造的 - 只是一個指針,你隱藏的實例變量。

@implementation MyClass { 
    NSMutableArray *_myArray; 
} 

正如你可以在吸氣看到,你是初始化_myArray指針指向一個新的NSMutableArray:

- (NSMutableArray *) myArray { 
    if(!_myArray) { 
     NSLog(@"created"); 
     _myArray = [[NSMutableArray alloc] init]; 
    } 

    return _myArray; 
} 
在二傳手

但是,你只是更新的指針變量,你已經創建。

self.myArray = [[NSMutableArray alloc] init]; 

這會將你的類中的下列信息:

- (void) myArray: (NSMutableArray *) myArray { 
    _myArray = myArray; 
} 

正如你可以看到二傳手並不需要任何特殊的初始化的大部分時間。你想創建一個自定義setter的唯一時候是當你想驗證傳入對象有特殊的屬性。一個人爲的例子是檢查該NSMutableArray中不大於10個對象:

- (void) myArray: (NSMutableArray *) myArray { 
    if (myArray.count < 10) { 
     _myArray = myArray; 
    } 
} 

最後,我想指出的是您可以使用短三元運算符和括號返回值居然懶實例化對象。例如,下面的語句:

- (NSMutableArray *) myArray { 
    return (_myArray = _myArray ?: @{}.mutableCopy); 
} 

等於:

- (NSMutableArray *) myArray { 
    if(!_myArray) { 
     _myArray = [[NSMutableArray alloc] init]; 
    } 
    return _myArray; 
} 

You can even macro this pattern into (WSM is my class prefix):

#define WSM_LAZY(object, assignment) (object = object ?: assignment) 

所以,你可以寫的語句是這樣的:

- (NSMutableArray *) myArray { 
    return WSM_LAZY(_myArray, @{}.mutableCopy); 
} 

甚至使用compound statement syntax重寫你提出作爲一個例子原二傳手:

- (NSMutableArray *) myArray { 
    return WSM_LAZY(_myArray, ({ 
     NSLog(@"created"); 
     @{}.mutableCopy; 
    })); 
} 
+0

你的解釋是有幫助的,也是宏定義! – ElmerCat