Я представляю важное ограничение одного из ранних ответов, а также объяснение и улучшение.
Johnmph предложил использовать [NSValue valueWithNonretainedObject:]
.
Обратите внимание, что, когда вы это сделаете, ваша ссылка действует не как __weak
, а скорее как __unsafe_unretained
, а внутри объекта NSValue. Более конкретно, когда вы пытаетесь вернуть свою ссылку (используя [myNSValue nonretainedObjectValue]), ваше приложение выйдет из строя с помощью сигнала EXC_BAD_ACCESS, если объект был освобожден до этого времени!
Другими словами, слабая ссылка не устанавливается автоматически в нуль, находясь внутри объекта NSValue
. Это заняло у меня несколько часов, чтобы понять. Я работал над этим, создав простой класс с слабым значением 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
Вы почти наверняка не хотите этого делать. Обычно в такой ситуации ваш код должен транслировать 'NSNotification', на который подписываются несколько объектов (делегаты в вашем вопросе). –
Майк, боюсь, я хочу - для контроля и соображений безопасности. Я хочу знать, какие вещи связаны с моим делегатом. – wh1t3cat1k
Я предлагаю не-бороться-рамки и использовать NSPointerArray с NSPointerFunctionsWeakMemory NSPointerFunctionOption – leviathan