Supposons que l'Objet A une propriété:
@property (nonatomic, strong) Foo * bar;
Synthétisé dans la mise en œuvre comme:
@synthesize bar = _bar;
L'objet B manipule un Foo **
, comme dans cet exemple d'appel à partir de l'Objet A:
Foo * temp = self.bar;
[objB doSomething:&temp];
self.bar = temp;
- Cela peut-il, ou quelque chose de similaire, être fait légitimement?
- Qu'est-ce que la déclaration correcte pour l'
doSomething:
méthode?
En outre, supposons que l'Objet B peut être libéré avant que j'ai une chance de régler le bar
de la propriété (et donc à prendre sur la propriété de l'instance pointée par temp
) - Comment puis-je dire de l'ARC à la main d'un propriétaire de référence? En d'autres termes, si je voulais l'exemple suivant extrait de travailler, comment aurais-je besoin de la poignée de l'ARC des questions?
Foo * temp = self.bar; // Give it a reference to some current value
[objB doSomething:&temp]; // Let it modify the reference
self.bar = nil; // Basically release whatever we have
_bar = temp; // Since we're getting back an owning reference, bypass setter
- Que ne suis-je pas pensé?
MODIFIER
Basé sur @KevinBallard 's réponse, je veux juste confirmer ma compréhension. Est-ce correct?
Objet:
@implementation ObjectA
@synthesize bar = _bar;
- (void)someMethod
{
ObjectB * objB = [[ObjectB alloc] initWithFoo:&_bar];
// objB handed off somewhere and eventually it's "doSomething" method is called.
}
@end
L'Objet B:
@implementation ObjectB
{
Foo * __autoreleasing * _temp;
}
- (id)initWithFoo:(Foo * __autoreleasing *)temp
{
id self = [super init];
if (self)
{
_temp = temp;
}
return self;
}
- (void)doSomething
{
...
*_temp = [[Foo alloc] init];
...
}
@end
Cela crée une erreur de compilation: passing address of non-local object to __autoreleasing parameter for write-back