Предположим, что Объект A имеет свойство:
@property (nonatomic, strong) Foo * bar;
Синтезируется в реализации как:
@synthesize bar = _bar;
Объект B управляет Foo **
, как в этом примере, вызов из Объекта A:
Foo * temp = self.bar;
[objB doSomething:&temp];
self.bar = temp;
- Можно ли сделать это или что-то подобное законно?
- Какое правильное объявление для метода
doSomething:
?
Кроме того, предположим, что Object B может быть освобожден до того, как у меня появится возможность установить свойство bar
(и, таким образом, взять на себя ответственность за экземпляр, на который указывает temp
). Как я могу сказать ARC передать ссылку на владение? Другими словами, если бы я хотел, чтобы следующий фрагмент примера работал, как мне нужно будет обрабатывать проблемы ARC?
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
- О чем я не думаю?
ИЗМЕНИТЬ
Основываясь на ответе @KevinBallard, я просто хочу подтвердить свое понимание. Правильно ли это?
Объект A:
@implementation ObjectA
@synthesize bar = _bar;
- (void)someMethod
{
ObjectB * objB = [[ObjectB alloc] initWithFoo:&_bar];
// objB handed off somewhere and eventually it "doSomething" method is called.
}
@end
Объект 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
Это создает ошибку времени компиляции: passing address of non-local object to __autoreleasing parameter for write-back