2015-05-22 76 views
0

我正在學習Big-Nerd Ranch指南的Objective-C。 筆者使用存儲從該控制器可以得到一些數據顯示:通過私有屬性初始化一個屬性

#import "BNRItemStore.h" 
#import "BNRItem.h" 

@interface BNRItemStore() 

@property(nonatomic) NSMutableArray *privateItems; 

@end 

@implementation BNRItemStore 

+(instancetype)sharedStore { 
    static BNRItemStore *sharedStore = nil; 

    if (!sharedStore){ 
     sharedStore = [[BNRItemStore alloc] initPrivate]; 
    } 
    return sharedStore; 
} 

-(instancetype)initPrivate { 
    self = [super init]; 
    if (self) { 
     _privateItems = [[NSMutableArray alloc] init]; 
    } 
    return self; 
} 

我的問題是關於_privateItems = [[NSMutableArray alloc] init];線:爲什麼我們初始化_privateItems而不是privateItems

問候。

+0

羅恩將它釘在頭上。如果你正在尋找外部引用,請參閱[不要在初始化方法中使用訪問器方法和dealloc](https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmPractical。 HTML#// apple_ref/DOC/UID/TP40004447-SW6)。 – Rob

回答

2

privateItems是屬性名稱。每個屬性後面都有一個變量,默認名稱爲_propertyName。在你的情況下它是_privateItems

大多數情況下,您可以使用屬性來設置值,如下所示:self.privateItems = [[NSMutableArray alloc] init]。但是,您不應該直接在init方法中設置屬性,這就是作者爲什麼直接將值設置爲變量的原因。

+0

感謝您的回答。爲什麼在init方法中它不是「可行的」? – Johnny

+1

這是*可行*,它只是沒有完成。有幾個有點模糊的陷阱。一般規則是直接在'-init'和'-dealloc'中操作ivars,因爲在'-init'中,對象可能只是部分設置(由於繼承),在'-dealloc'中對象可能部分被拆除。甚至更一般的說法是,你不應該在一個對象上調用任何虛擬方法(並且Obj-C中的所有方法都是虛擬的),這個對象可能只是部分構建或者已經部分拆除。 – ipmcc