代表的非保留数组
在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有几个发送事件的概念,你应该为每个事件使用适当的概念。
- 目标操作:用于UI控件,例如按下button。 一个发件人,零个或多个接收者。
- 代表:仅限一个发件人和一个收件人。
- 通知: 一个发件人, 零个或多个接收者。
- 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。