__weak指针类型即使在强指针释放相同对象后仍保持对象

时间:2014-06-28 07:42:53

标签: objective-c cocoa-touch cocoa

在将属性声明为弱类型然后将其作为参数传递给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)时,我会看到对象的详细信息,然后登录到控制台。  请任何人解释为什么会这样。

1 个答案:

答案 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)