2009-12-20 56 views
1

在iPhone的Objective-C世界性能,我已經隨處可見這種模式,我用它自己所有的時間並沒有真正理解正在發生的事情:「初始化」,這是保留

在Test.h

@interface Test: UIViewController 
{ 
    NSMutableArray *testArray; 
} 
@property (retain, nonatomic) NSMutableArray *testArray; 

而且在Test.m

@implementation Test 
@synthesize testArray 

- (void) viewDidLoad 
{ 

    // why do we do this? 
    NSMutableArray *init = [[NSMutableArray alloc] init]; 
    self.testArray = init; 
    [init release]; 

    [self.testArray addObject: @"A"]; // why can't I do this directly? 
    ... 
} 

- (void) dealloc 
{ 
    [testArray release]; 
    [super dealloc]; 
} 

我的問題是:如果testArray上有一個保留,當它在屬性的聲明,爲什麼我們需要創建一個新的NSMutableArray初始化對象,分配日在測試數組並釋放?爲什麼我不能在viewDidLoad中開始使用testArray而不做其他任何事情?我知道有關這樣做的最佳方式(創建一個新對象或使用autorelease對象)存在一些爭議,但在這兩種情況下,我們都以testArray的保留計數爲1結束。我相信'保留'財產已經給了它。那麼爲什麼需要創建這個init對象呢?

回答

7

'retain'屬性不會自動創建一個NSMutableArray 。你相反,它只是表明,每當你分配東西的財產,它將會被保留

如果你的代碼是這樣的:

- (void) viewDidLoad 
{ 
    [self.testArray addObject: @"A"]; 
} 

然後self.testArray會nil,因此這將是必要的幾乎沒有任何操作。直到你給self.testArray指定了一些東西,它是空的。

這是發生了什麼事。

- (void) viewDidLoad 
{ 
    // we need to assign an NSMutableArray to self.testArray. 

    NSMutableArray *init = [[NSMutableArray alloc] init]; 
    // The array has been retained once (by the call to |alloc|) 

    self.testArray = init; 
    // The array is assigned to a property with the 'retain' attribute 
    // Thus, the array has now been retained twice 

    [init release]; 
    // We release the array, so it now is retained once. 

    // We now have an array in self.testArray, so we can add something to it. 
    [self.testArray addObject: @"A"]; 
} 
+0

謝謝;現在有道理。 – 2009-12-20 22:00:18

1

@property指令中的「retain」指定setter應保留輸入值而不是簡單地複製該值。它與分配(預留內存)和初始化(構建對象)對象無關。保留在@property指令中,只是在調用setter時調用保留計數(這會讓你去執行類似self.myobject =某些事情,而沒有專門調用retain。)

相關問題