在将属性声明为弱类型然后将其作为参数传递给removeObject:消息之后,“selectedLine”指针不再应该保留它先前指向的对象。 在这一行之后 -
[completeLines removeObject:selectedLine]//completeLines is a mutable array here.
使用ARC原则后,selectedLine指针不应该在此之后立即指向nil。我早些时候已经把它变成了弱类型。 包含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);
在控制台中,当我应该看到(null)时,我会看到对象的详细信息,然后登录到控制台。 请任何人解释为什么会这样。
答案 0 :(得分:0)
它无法正常工作,因为在ARC下添加对数组的弱引用时,它会保存此对象的引用。如果你想在数组内部弱引用,你应该将这个引用包装在一个块中。像这样:
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)