我是Objective-C和iPhone開發的新手,已經使用Apress的Beginning iPhone 3 Programming作爲我幾個星期的主要指導。在少數情況下爲viewDidLoad中的一部分:方法,像breadTypes NSArray的實例變量被初始化像下面,具有限定的中間陣列,然後最終設置爲實際陣列是這樣的:正確的NSArray在方法中對伊娃數據進行初始化
NSArray *breadArray = [[NSArray alloc] initWithObjects:@"White", @"Whole Weat", @"Rye", @"Sourdough", @"Seven Grain", nil];
self.breadTypes = breadArray;
[breadArray release];
爲什麼這樣做而不僅僅是這樣:
self.breadTypes = [[NSArray alloc] initWithObjects:@"White", @"Whole Weat", @"Rye", @"Sourdough", @"Seven Grain", nil];
這兩個似乎工作時,我編譯和運行它。上面的第二種方法是否沒有做適當的內存管理?我假定initWithObjects:返回一個數組爲1的保留計數和餘最終在的dealloc再次釋放breadTypes:方法,以便很好地包裹東西:
- (void)dealloc {
...
[breadTypes release];
[super dealloc];
}
設定器可通過標準的屬性定義(和最終的合成)指令:
@property (nonatomic, retain) NSArray *breadTypes;
最終,雖然在此ViewController的dealloc方法中,breadTypes數組並沒有被釋放。那裏有一個[breadTypes發佈]的電話。這不足以清理嗎? 我在猜測arrayWithObjects使用autorelease,並且這裏的想法可能是由於iPhone上的內存限制而對某些東西被釋放時有更嚴格的控制。 – 2010-05-30 09:59:47
在你的第二種方式中,有一個缺失版本: 1)數組的創建給出了一個保留。 2)賦值給予保留。3)控制器的dealloc發佈。 你可以做什麼來調用發佈權後,賦予正確的發佈計數。但它取決於getter的實現。 – 2010-05-30 10:05:48
洛朗,我想我現在明白了。查看我更新的帖子,瞭解設置setter的屬性定義。那麼在一行中,arrayWithObjects和setter方法都會將保留計數每增加1?那麼你是對的,在dealloc中調用release一次並沒有正確地清理它。謝謝! – 2010-05-30 10:15:08