У меня есть сомнения по поводу автоматического повторного пула при автоматическом подсчете ссылок (ARC)
В моем примере (вставлено ниже) у меня есть автозапуск, и у меня нет операторов в блоке автозапуска. После блока автозапуска существует автоматически освобожденный экземпляр (a3).
Ожидаемое поведение:
Я ожидал, что следующее утверждение вызовет утечку памяти, поскольку оно не инкапсулировано в автозапуск.
A* a3 = b1.xa1;
Фактическое поведение:
Фактическое поведение - ошибка утечки памяти во время выполнения
Примечание:
Если автозапуск перемещается после инициализации a3, то во время выполнения выдается ошибка утечки памяти
Мое понимание:
Только операторы в autoreleasepool будут иметь эффект пула autorelease, но в моем примере это не так.
Вопрос:
- Какова причина, почему это происходит?
- Есть ли какое-либо значение
операторы с блоком авто-релиза? или это просто хорошо
достаточно иметь пустой блок автозапуска перед
авто-выпущенный экземпляр? Если так, почему?
Краткое изложение моего вопроса
Вопрос в том, что вложенные операторы в autoreleasepool имеют такой же эффект, как и операторы размещения после autoreleasepool, даже если он находится вне autoreleasepool
Код:
#import<Foundation/Foundation.h>
@interface A : NSObject
- (void) dealloc;
@end
@implementation A
- (void) dealloc { printf("instance of A deallocated = %p\n", self); };
@end
@interface B : NSObject
@property (weak) A* xa1;
- (void) dealloc;
@end
@implementation B
@synthesize xa1;
- (void) dealloc { printf("instance of B deallocated = %p\n", self); };
@end
int main()
{
system("clear");
B* b1 = [[B alloc] init];
A* a1 = [[A alloc] init];
A* a2 = [[A alloc] init];
b1.xa1 = a1;
@autoreleasepool
{}
A* a3 = b1.xa1; //I expected this to throw a memory leak error, but it doesn't
//Note - b1.xa1 returns an autoreleased instance
printf("--- end of main\n");
return(0);
}