代表的非保留数组

在Cocoa Touch项目中,我需要一个特定的类不仅有一个委托对象,但其中有很多。

看起来我应该为这些代表创build一个NSArray; 问题是,NSArray将保留所有这些代表,而不应该(通过约定的对象不应该保留他们的代表)。

我应该写我自己的数组类,以防止保留或有更简单的方法? 谢谢!

我发现这段代码在一段时间之前(不记得是谁的属性)。

这是相当独创的,使用一个类别允许创build一个可变的数组,通过适当的callback支持与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

我提出了一个较早的答案的重要限制,并加以解释和改进。

Johnmphbuild议使用[NSValue valueWithNonretainedObject:]

请注意,当您这样做时,您的引用不像__weak ,而是像在NSValue对象内的__unsafe_unretained 。 更具体地说,当你试图让你的引用回来(使用[myNSValue nonretainedObjectValue]),你的应用程序将崩溃与EXC_BAD_ACCESS信号,如果对象已经释放在那个时间之前!

换句话说,在NSValue对象内部,弱引用不会自动设置为nil。 这花了我一大堆的时间来弄清楚。 我已经通过创build一个只有弱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 

检查NSValue valueWithNonretainedObject方法的文档:

此方法对于防止在将对象添加到集合对象(如NSArray或NSDictionary的实例)时保留该对象很有用。

你不想这样做! Cocoa Touch有几个发送事件的概念,你应该为每个事件使用适当的概念。

  1. 目标操作:用于UI控件,例如按下button。 一个发件人,零个或多个接收者。
  2. 代表:仅限一个发件人和一个收件人。
  3. 通知: 一个发件人, 零个或多个接收者。
  4. KVO:更细粒度的通知。

你应该做的是看看如何使用NSNotificationCenter类。 这是发送具有多个接收者的通知的正确方法。

我build议不要打架,并使用NSPointerFunctionsWeakMemory NSPointerFunctionOption像这样的NSPointerFunctionsWeakMemory

 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. 

在场景中为我提供了良好的服务,在这里我必须devise一个委托数组,这是一个自动NULL的引用。

这个来自NIMBUS的将会更简单:

 NSMutableArray* NICreateNonRetainingMutableArray(void) { return (NSMutableArray *)CFArrayCreateMutable(nil, 0, nil); } NSMutableDictionary* NICreateNonRetainingMutableDictionary(void) { return (NSMutableDictionary *)CFDictionaryCreateMutable(nil, 0, nil, nil); } NSMutableSet* NICreateNonRetainingMutableSet(void) { return (NSMutableSet *)CFSetCreateMutable(nil, 0, nil); } 

我从Three20项目中find了一些关于这个主题的代码,我希望这有助于…

 NSMutableArray* TTCreateNonRetainingArray() { CFArrayCallBacks callbacks = kCFTypeArrayCallBacks; callbacks.retain = TTRetainNoOp; callbacks.release = TTReleaseNoOp; return (NSMutableArray*)CFArrayCreateMutable(nil, 0, &callbacks); } NSMutableDictionary* TTCreateNonRetainingDictionary() { CFDictionaryKeyCallBacks keyCallbacks = kCFTypeDictionaryKeyCallBacks; CFDictionaryValueCallBacks callbacks = kCFTypeDictionaryValueCallBacks; callbacks.retain = TTRetainNoOp; callbacks.release = TTReleaseNoOp; return (NSMutableDictionary*)CFDictionaryCreateMutable(nil, 0, &keyCallbacks, &callbacks); } 

我find了一个名为XMPPFramewrok的开源库

项目中有一个多播委托解决scheme

https://github.com/robbiehanson/XMPPFramework/wiki/MulticastDelegate

怎么样在数组或字典中存储

 __weak typeof(pointer) weakPointer = pointer; 

关键字: NSHashTable ,在文档中search。