以下兩個例子似乎都可以正常工作。在實施例1,插件在while循環之前創建的:何時使用alloc init
-(int)compareWidgets { // Example 1
int count = 0;
NSMutableArray *widgetsCopy = [self.widgets mutableCopy];
Widgets *widget = [[Widgets alloc]init]; // HERE ? or...
while (widgetsCopy.count) {
widget = [widgetsCopy lastObject];
[widgetsCopy removeLastObject];
for (Widgets *compareWidget in widgetsCopy)
if (compareWidget.value == widget.value)
count += 1;
}
return count;
}
在例2中,插件的while循環中創建 ...
-(int)compareWidgets { // Example 2
int count = 0;
NSMutableArray *widgetsCopy = [self.widgets mutableCopy];
while (widgetsCopy.count) {
Widgets *widget = [widgetsCopy lastObject]; // HERE ?
[widgetsCopy removeLastObject];
for (Widgets *compareWidget in widgetsCopy)
if (compareWidget.value == widget.value)
count += 1;
}
return count;
}
Q1:在示例1中,小部件僅分配一次/初始化一次,然後似乎爲通過該陣列的每次迭代重新分配。在示例2中,從未使用alloc/init,但小部件再次通過每次迭代成功分配。爲什麼這是可能的,哪個例子是正確的或者更好的?
Q2:另外,在任一情況下,插件被分配給其立即從它的陣列中移除的陣列對象:[widgetsCopy removeLastObject]。由於對象小工具指向已經從其陣列中刪除,爲什麼不是小工具在這一點上爲零 - 爲什麼它會繼續保留正確的值?
謝謝。
您應該閱讀[iOS內存管理基礎知識](http://blog.teamtreehouse.com/ios-memory-management-part-1)。現代iOS使用稱爲ARC的系統,消除了大量的樣板,但您仍然需要熟悉基礎知識,並從您的問題來判斷您還沒有。 – bdesham