2014-01-28 34 views
1

以下兩個例子似乎都可以正常工作。在實施例1,插件在while循環之前創建的:何時使用alloc init

-(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:另外,在任一情況下,插件被分配給其立即從它的陣列中移除的陣列對象:[widgetsCopy removeLastObject]。由於對象小工具指向已經從其陣列中刪除,爲什麼不是小工具在這一點上爲零 - 爲什麼它會繼續保留正確的值?

謝謝。

+0

您應該閱讀[iOS內存管理基礎知識](http://blog.teamtreehouse.com/ios-memory-management-part-1)。現代iOS使用稱爲ARC的系統,消除了大量的樣板,但您仍然需要熟悉基礎知識,並從您的問題來判斷您還沒有。 – bdesham

回答

1

第一個代碼段創建與alloc/init一個對象,然後將while的主體立即釋放它。

沒有必要創建一個對象並將其分配給您的變量以使該變量爲「有效」:只要在賦值時它在範圍內,就可以分配該變量。

Widget不會成爲nil向右走,因爲ARC變量下是__strong默認情況下,這樣的分配widget導致相應的對象被保留。如果您將Widget *widget更改爲__weak Widget *widget,您會在那裏看到nil,但是首先聲明該變量毫無意義。

0

將指針視爲空框。在第一個示例中,您將一個新的小部件放入該框中。那麼接下來你要做的就是清空那個盒子,並把lastObject放在那個盒子裏。這個例子有點小問題,因爲小部件仍然在那個數組中,直到你移除最後一個對象。 ARC可以讓您不必擔心它有多少個盒子。一旦它從最後一個盒子中取出,它就會被釋放。

相關問題