Я представляю важное ограничение одного из предыдущих ответов вместе с объяснением и улучшением.
Джонф предложил использовать [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