簡體   English   中英

何時使用alloc init

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM