У меня есть сомнения относительно weak
свойства в ARC (автоматический подсчет ссылок)
Мое понимание (поправьте меня, если я ошибаюсь):
weak
свойство ведет себя подобно свойству assign
, за исключением того, что когда экземпляр, на который указывало свойство, уничтожается, ивару присваивается значение nil.
Вопрос:
- Я просто чувствую, что получатель свойства
weak
сохраняет и автоматически выпускает.Разве это не значит, что он ведет себя как получатель свойства assign
, когда получатель не сохраняет и автоматически выпускает (пожалуйста, обратитесь к программе)
Программа:
Ниже приведена программа с фактическим и ожидаемым результатом.
Примечание - Когда я изменяю свойство с weak
на assign
мойожидаемый результат достигнут
#import<Foundation/Foundation.h>
@interface A : NSObject
- (void) dealloc;
@end
@implementation A
- (void) dealloc
{
printf("\tinstance of A deallocated = %p\n", self);
}
@end
@interface B : NSObject
@property (weak) A* xa1;
- (void) dealloc;
@end
@implementation B
@synthesize xa1;
- (void) dealloc
{
printf("\tinstance of B deallocated = %p\n", self);
}
@end
int main()
{
B* b1 = [[B alloc] init];
@autoreleasepool //autoreleasepool 1
{
{ //block 1
A* a1 = [[A alloc] init];
printf("\ta1 = %p\n", a1);
b1.xa1 = a1;
A* a3 = b1.xa1;
printf("--- end of block 1\n");
} //at this point i expected instance pointed by a1 to be destroyed
printf("--- end of autoreleasepool 1\n");
}
printf("---- end of main\n");
return(0);
}
Фактический результат:
a1 = 0x10d713f50
--- end of block 1
--- end of autoreleasepool 1
instance of A deallocated = 0x10d713f50
---- end of main
instance of B deallocated = 0x10d713d30
Мой ожидаемый результат:
a1 = 0x10d713f50
--- end of block 1
instance of A deallocated = 0x10d713f50
--- end of autoreleasepool 1
---- end of main
instance of B deallocated = 0x10d713d30
Спасибо