[英]When to use alloc init
以下兩個示例似乎都可以正常工作。 在示例1中, 小部件是在while循環之前創建的:
-(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;
}
問題1:在示例1中, 小部件僅分配/初始化一次,然后似乎通過數組為每次迭代重新分配。 在示例2中,從未使用alloc / init,但是在每次迭代中都成功地分配了小部件 。 為什么這是可能的,哪個例子是正確的或可取的?
Q2:同樣,在任何一種情況下, 小部件都分配給一個數組對象,該對象立即從其數組中刪除: [widgetsCopy removeLastObject] 。 由於對象小部件指向的對象已從其數組中刪除,為什么小部件此時不為零-為什么它繼續保留正確的值?
謝謝。
第一個代碼段使用alloc
/ init
創建一個對象,然后while
的主體立即釋放它。
無需創建對象並將其分配給您的變量即可使該變量“有效”:您可以分配變量,只要該變量在分配時在范圍內即可。
widget
Widget
不會立即變為nil
,因為在ARC下,默認情況下__strong
是變量,因此對widget
的分配會導致保留相應的對象。 如果將Widget *widget
更改為__weak Widget *widget
,那么那里會顯示nil
,但是首先聲明該變量是沒有意義的。
將指針視為一個空盒子。 在第一個示例中,您在該框中放置了一個新的小部件。 然后,接下來要做的是清空該框,然后將lastObject放入該框。 由於該小部件也仍在該數組中,直到您刪除最后一個對象,該示例才出現問題。 ARC讓您不必擔心它里面有多少盒子。一旦從最后一個盒子中取出它,它就會被釋放。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.