以下两个例子似乎都很好用。在示例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;
}
Q1:在示例1中, widget 仅被分配/初始化一次,然后似乎在每次迭代通过数组时被重新分配。在示例2中,从不使用alloc / init,但是再次通过每次迭代成功分配了 widget 。为什么这是可能的,哪个例子是正确的还是更可取的?
Q2:此外,在任何一种情况下, widget 都会分配给一个数组对象,该对象会立即从其数组中删除: [widgetsCopy removeLastObject] 。由于对象小部件指向已从其数组中删除,为什么小部件 nil此时为止 - 为什么它会继续保留正确的值?
感谢。
答案 0 :(得分:1)
第一个代码段使用alloc
/ init
创建一个对象,然后while
的正文立即释放它。
无需创建对象并将其分配给变量以使该变量“有效”:只要在变量分配时它就在范围内,就可以分配变量。
Widget
不会立即变为nil
,因为默认情况下ARC变量为__strong
,因此对widget
的分配会导致保留相应的对象。如果您将Widget *widget
更改为__weak Widget *widget
,那么您会看到nil
,但是首先声明该变量毫无意义。
答案 1 :(得分:0)
将指针视为空盒子。在第一个示例中,您将新窗口小部件放在该框中。接下来你要做的就是清空那个盒子并将lastObject放在那个盒子里。该示例分解了一点,因为小部件仍然在该数组中,直到您删除最后一个对象。 ARC让你不必担心它有多少盒子。一旦从最后一个盒子里取出它就会被释放。