何时使用alloc init

时间:2014-01-28 18:04:10

标签: 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) {
        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此时为止 - 为什么它会继续保留正确的值?

感谢。

2 个答案:

答案 0 :(得分:1)

第一个代码段使用alloc / init创建一个对象,然后while的正文立即释放它。

无需创建对象并将其分配给变量以使该变量“有效”:只要在变量分配时它就在范围内,就可以分配变量。

Widget不会立即变为nil,因为默认情况下ARC变量为__strong,因此对widget的分配会导致保留相应的对象。如果您将Widget *widget更改为__weak Widget *widget,那么您会看到nil,但是首先声明该变量毫无意义。

答案 1 :(得分:0)

将指针视为空盒子。在第一个示例中,您将新窗口小部件放在该框中。接下来你要做的就是清空那个盒子并将lastObject放在那个盒子里。该示例分解了一点,因为小部件仍然在该数组中,直到您删除最后一个对象。 ARC让你不必担心它有多少盒子。一旦从最后一个盒子里取出它就会被释放。