Je suis présentant une limitation importante de l'une des premières réponses, avec une explication et une amélioration.
Johnmph a suggéré d'utiliser [NSValue valueWithNonretainedObject:]
.
Notez que lorsque vous faites cela, votre référence agit pas comme __weak
, mais plutôt comme __unsafe_unretained
, tandis que l'intérieur de la NSValue objet. Plus précisément, lorsque vous essayez d'obtenir votre référence arrière (à l'aide de [myNSValue nonretainedObjectValue]), votre application plante avec un EXC_BAD_ACCESS signal si l'objet a été libéré avant que le temps!
En d'autres termes, la faiblesse de référence n'est pas automatiquement mis à zéro à l'intérieur de l' NSValue
objet. Ce qui m'a pris un tas d'heures pour comprendre. J'ai travaillé autour de ce par la création d'une classe simple avec seulement une faible ref de propriété.
Plus belle manière, en utilisant NSProxy
, nous pouvons traiter l'objet wrapper entièrement, comme si c'est le contenu de l'objet lui-même!
// 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