【问题标题】:How to store weak reference object in array, dictionary in objc?如何将弱引用对象存储在数组中,字典中的objc?
【发布时间】:2014-02-15 12:36:15
【问题描述】:

众所周知,当您将对象添加到数组 (NSMutableArray) 或字典 (NSMutableDictionary) 时,它会创建对该对象的强引用。

是否可以将对象添加到具有弱引用的数组中?

【问题讨论】:

    标签: ios objective-c nsarray weak-references


    【解决方案1】:

    1.NSValue

    + (NSValue *)valueWithNonretainedObject:(id)anObject
    

    如果您想将对象添加到集合但不希望集合创建对其的强引用,此方法很有用。

    2. 使用块有一个棘手的方法:

    typedef id (^WeakReference)(void);
    
    WeakReference MakeWeakReference (id object) {
        __weak id weakref = object;
        return ^{ return weakref; };
    }
    
    id WeakReferenceNonretainedObjectValue (WeakReference ref) {
        if (ref == nil)
            return nil;
        else
            return ref ();
    }
    
    [arr addObject:MakeWeakReference(obj)];
    id newobj = WeakReferenceNonretainedObjectValue([arr objectAtIndex:0]);
    

    3.使用一个自定义的 WeakReference 类,该类持有指向该值的弱指针。


    其实上述方法的设计思路都是一样的。

    【讨论】:

    • 更好的选择:NSPointerArray
    • 如果使用 valueWithNonretainedObject,则 NSValue 将不包含 weak 引用,而是包含 nonretained object。如果对象被释放并且您访问该引用,则可能导致崩溃。
    • 提示:使用[NSPointerArray weakObjectsPointerArray]
    【解决方案2】:

    您可以使用NSValue valueWithNonretainedObject: 强存储弱引用目标对象的值。

    【讨论】:

    • __weak typeof(object) weakObject = object; [NSMutableArray addObject:weakObject]; 等其他方法是否有效?或者[NSMutableArray addObject:(id)object];
    • @nhgrif 我相信这行不通。 NSArray 创建对 id-pointer 指向的对象的强引用,无论 id-pointer 是强指针还是弱指针。
    • @nhgrif,lancy 确实是正确的,即使变量是 __weak,数组仍然会保留传递的对象。
    【解决方案3】:
    NSMutableArray *arrayStrong = [NSMutableArray arrayWithObjects:
                                          [[yourClass alloc] init],
                                          [[yourClass alloc] init], nil];
    
    NSPointerArray *arrayWeak = [NSPointerArray weakObjectsPointerArray];
    
    for(yourClass *obj in arrayStrong){
        [arrayWeak addPointer:(__bridge void*)(obj)];
    }
    

    【讨论】:

      猜你喜欢
      • 2014-08-11
      • 2021-01-03
      • 1970-01-01
      • 2014-04-21
      • 1970-01-01
      • 1970-01-01
      • 2021-01-12
      • 2016-02-13
      • 2016-07-30
      相关资源
      最近更新 更多