Mar*_*ell 48
我在前一段时间找到了这段代码(不记得是谁归于此).
它非常巧妙,使用Category来允许创建一个可变数组,该数组不会通过CFArray使用适当的回调来保留/释放.
@implementation NSMutableArray (WeakReferences)
    + (id)mutableArrayUsingWeakReferences {
    return [self mutableArrayUsingWeakReferencesWithCapacity:0];
    }
    + (id)mutableArrayUsingWeakReferencesWithCapacity:(NSUInteger)capacity {
    CFArrayCallBacks callbacks = {0, NULL, NULL, CFCopyDescription, CFEqual};
    // We create a weak reference array
    return (id)(CFArrayCreateMutable(0, capacity, &callbacks));
    }
@end
编辑找到原始文章:http://ofcodeandmen.poltras.com
Tim*_*imo 26
我提出了一个早期答案的重要限制,以及解释和改进.
Johnmph建议使用[NSValue valueWithNonretainedObject:].
请注意,执行此操作时,您的引用不会像NSValue对象中的那样__weak,而是更像__unsafe_unretained.更具体地说,当您尝试获取引用时(使用[myNSValue nonretainedObjectValue]),如果在此之前对象已被释放,则应用程序将使用EXC_BAD_ACCESS信号崩溃!
换句话说,弱NSValue对象在对象内部时不会自动设置为nil .这让我花了很多时间才弄明白.我通过创建一个只有弱ref属性的简单类来解决这个问题.
更美妙的是,通过使用NSProxy,我们可以完全将包装器对象视为包含的对象本身!
// WeakRef.h
@interface WeakRef : NSProxy
@property (weak) id ref;
- (id)initWithObject:(id)object;
@end
// WeakRef.m
@implementation WeakRef
- (id)initWithObject:(id)object
{
    self.ref = object;
    return self;
}
- (void)forwardInvocation:(NSInvocation *)invocation
{
    invocation.target = self.ref;
    [invocation invoke];
}
- (NSMethodSignature *)methodSignatureForSelector:(SEL)sel
{
    return [self.ref methodSignatureForSelector:sel];
}
@end
Joh*_*mph 17
检查NSValue valueWithNonretainedObject方法的文档:
此方法可用于防止在将对象添加到集合对象(例如NSArray或NSDictionary的实例)时保留该对象.
lev*_*han 13
我建议不要拼-的框架,并使用NSPointerArray与NSPointerFunctionsWeakMemory NSPointerFunctionOption这样的:
NSPointerArray *weakReferencingArray = [NSPointerArray pointerArrayWithOptions:NSPointerFunctionsWeakMemory];
// NSPointerFunctionsWeakMemory - Uses weak read and write barriers 
// appropriate for ARC or GC. Using NSPointerFunctionsWeakMemory 
// object references will turn to NULL on last release.
在场景中我很好,我必须设计一个委托数组,自动NULL的引用.
Pey*_*loW 12
你不想这样做!Cocoa Touch有几个发送事件的概念,你应该为每个案例使用正确的概念.
你应该做的是研究如何使用NSNotificationCenter类.这是发送具有多个接收器的通知的正确方法.