Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 何时使用alloc init_Objective C_Arrays_Pointers_Allocation - Fatal编程技术网

Objective c 何时使用alloc init

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) {

下面的两个例子似乎都很好。在示例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中,小部件只分配/初始化一次,然后似乎在数组中的每次迭代中都会重新分配它。在示例2中,从未使用alloc/init,但在每次迭代中都成功地分配了小部件。为什么这是可能的,哪个例子是正确的或更可取的

Q2:同样,在这两种情况下,小部件都被分配给一个数组对象,该对象立即从其数组中删除:[WidgetScope RemovelAsObject]。既然小部件指向的对象已经从其数组中删除,为什么小部件现在不是nil——为什么它继续保留正确的值


谢谢。

第一个代码片段使用
alloc
/
init
创建一个对象,然后
的主体会立即释放它

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


Widget
不会立即变为
nil
,因为默认情况下ARC下的变量是
\u strong
,因此对
Widget
的赋值会导致保留相应的对象。如果您将
Widget*Widget
更改为
\uu弱Widget*Widget
,您将在那里看到
nil
,但是首先声明该变量没有意义。

将指针视为空框。在第一个示例中,您在该框中放置了一个新的小部件。接下来你要做的就是清空那个盒子,把最后一个对象放进那个盒子里。该示例有点崩溃,因为在移除最后一个对象之前,小部件仍然在该数组中。ARC让您不必担心它在多少盒子里。一旦从最后一个盒子中取出,它就会被释放

你应该读一下。现代iOS使用了一个名为ARC的系统,它消除了大量的样板文件,但你仍然需要熟悉基本原理,从你的问题判断,你还没有。