2013-04-22 17 views
0

爲什麼要使用@propertyNSArray爲什麼要在iOS中使用@property for NSArrays

的原因,我的問題是因爲我的印象是,@properties主要用於拍攝吸氣的優勢二傳手你時免費使用@property,但是當你分配一個NSArray到你知道你永遠不會使用getter和setter來訪問數組中的對象,爲什麼在這種情況下使用屬性。這是否與ARC有關,換句話說這是否被認爲是更好的內存管理實踐?

回答

4

您使用屬性來獲取或設置整個數組。您還可以使用該屬性訪問數組中的各個元素。

在數組中使用屬性與ARC或MRC無關。屬性是一種封裝數據的方式。而已。

如果您不希望提供對整個數組的訪問權限,請不要使用屬性。如果適合,添加方法來設置/獲取內部數組的各個元素。

2

使用單個方法或類之外的數組。 ClassA.array = ClassB.array;或者僅僅從同一個類的不同方法中讀取數組,因爲數組在執行後會立即釋放。

3

與其他答案一樣,我通常喜歡copy我的陣列出於安全目的。

如果客戶端接受NSArray,她可能會爲您提供NSMutableArray實例。如果是這種情況,並且你想確保你正在使用的數組沒有意外改變,你最好是copy而不是retain它。

屬性派上用場,在這種情況下,因爲你可以聲明

@property (nonatomic, copy) NSArray * myArray; 

,並確保你這個數組的唯一擁有者,分配後。

我通常對任何具有可變子類的類使用此策略,例如NSString,等,只要我關心數據的所有權。

這種策略的缺點當然是記憶效率,但最終工程是智能妥協的藝術。

+2

並注意最常見的情況,沒有內存成本,因爲'[NSArray的副本]'有效實施作爲'保留'(因爲它是不變的)。您只需在實際需要時付費(因爲它是可變數組)。 – 2013-04-22 21:56:27

2

但是當你將一個NSArray的屬性,你知道你永遠不會 使用getter和setter訪問數組,爲什麼在這種情況下使用 屬性中的對象。

對於所使用的屬性的其他對象相同的原因:

  • 存取:訪問器的陣列本身,而不是對象在數組中。它的情況並不少見,在一次獲取或設置整個數組:

    NSArray *kids = frank.children;     // get the array 
    mary.children = @[@"Nick", @"Sam", @"Susan"]; // set the array
  • 抽象:使用屬性,而不是訪問底層陣列直接可以更容易地改變後實施,應該說是必要的。

  • KVC合規:你可以免費獲得它的屬性。像陣列這樣的集合,KVC爲您提供了很多功能。您可以使用收集運營商如@avg和@max以及索引存取:

    int employees = [accounting countOfEmployees]; // same as [accounting.employees count] 
    Employee *thirdEmployee = [engineering objectInEmployeesAtIndex:2]; // same as [engineering.employees objectAtIndex:2]
相關問題