2014-06-28 63 views
0

在將屬性聲明爲弱類型並將其作爲參數傳遞給removeObject:消息後,不再需要「selectedLine」指針堅持它以前指向的對象。 在此之後LINE-__弱指針類型,即使在強指針釋放同一對象之後仍保留在對象上

[completeLines removeObject:selectedLine]//completeLines is a mutable array here. 

不應該selectedLine指針爲零後緊接本使用ARC原則被人指指點點。我早些時候已經把它變成了弱類型。 怎麼把一個的removeObject:實現必須是這個樣子:

-(void)removeObject:(id)obj{//obj pointer now shares an object with (__weak)selectedLine pointer 
    __weak id ptr; 
    for (ptr in completeLines) 
    { 
     if(ptr==obj) 
     obj=nil;// releasing a strong reference makes ptr as well as selectedLine automatically release the particular Line object. 
    } 
} 

但是當我登錄它的控制檯,弱指針似乎仍然在物體上: -

NSLog(@"%@", selectedLine); 

在控制檯我看到對象的細節時,我應該看到(空),而不是登錄到控制檯。 請任何人解釋爲什麼是這種情況..

+0

別的東西保留對象,比數組等。 –

+0

數組正在ARC中保留這個對象。 –

+0

但是強指針(參數變量) - 「obj」被指向removeObject中的零,而selectedLine是一個弱類型指針。所以沒有別的東西可以保留對象,是嗎? – rahulbsb

回答

0

它不工作,因爲在弧下,當你添加一個弱引用到一個數組它持有這個對象的引用。如果你想在數組內弱引用,你應該在一個塊中包含這個引用。就像這樣:

typedef id (^WeakBlock)(void); 

array = [NSMutableArray array]; 
obj = [NSObject new]; 

WeakBlock block = ^(void) { 
    typeof(obj) __weak wObj = obj; 
    return wObj; 
}; 

[array addObject:block]; 

WeakBlock blockInArray = [array firstObject]; 
NSLog(@"%@", blockInArray()); 

obj = nil; 

NSLog(@"%@", blockInArray()); 

輸出:

2014-06-28 11:25:56.174 weak-array[18604:60b] <NSObject: 0x8c7fcb0> 
2014-06-28 11:25:56.175 weak-array[18604:60b] (null) 
+0

好吧上面的removeObject:實現(庫版本cud是相似的)有3個指針指向實際的對象。 obj指針是強類型的,另外兩個類型都是弱類型的:selectedLine指針,作爲消息removeObject中的參數傳遞:然後是內部局部變量ptr。所以removeObject:方法必須在內部有強指針(只有一個,即obj)在實際實現中釋放對象,以便弱引用即selectedLine和本地var也自動釋放對象並指向nil。 – rahulbsb