Objective c 何时使用alloc init
下面的两个例子似乎都很好。在示例1中,小部件在while循环之前创建:Objective c 何时使用alloc init,objective-c,arrays,pointers,allocation,Objective C,Arrays,Pointers,Allocation,下面的两个例子似乎都很好。在示例1中,小部件在while循环之前创建: -(int)compareWidgets { // Example 1 int count = 0; NSMutableArray *widgetsCopy = [self.widgets mutableCopy]; Widgets *widget = [[Widgets alloc]init]; // HERE ? or... while (widgetsCopy.count) {
-(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:同样,在这两种情况下,小部件都被分配给一个数组对象,该对象立即从其数组中删除:[WidgetScope RemovelAsObject]。既然小部件指向的对象已经从其数组中删除,为什么小部件现在不是nil——为什么它继续保留正确的值
谢谢。第一个代码片段使用
alloc
/init
创建一个对象,然后的主体会立即释放它
为了使变量“有效”,无需创建对象并将其分配给变量:只要在分配时变量在范围内,就可以分配该变量
Widget
不会立即变为nil
,因为默认情况下ARC下的变量是\u strong
,因此对Widget
的赋值会导致保留相应的对象。如果您将Widget*Widget
更改为\uu弱Widget*Widget
,您将在那里看到nil
,但是首先声明该变量没有意义。将指针视为空框。在第一个示例中,您在该框中放置了一个新的小部件。接下来你要做的就是清空那个盒子,把最后一个对象放进那个盒子里。该示例有点崩溃,因为在移除最后一个对象之前,小部件仍然在该数组中。ARC让您不必担心它在多少盒子里。一旦从最后一个盒子中取出,它就会被释放 你应该读一下。现代iOS使用了一个名为ARC的系统,它消除了大量的样板文件,但你仍然需要熟悉基本原理,从你的问题判断,你还没有。