我在ARC关于weak
物业的疑问(自动引用计数)Objective-C的 - 弱属性 - 吸气自动释放(自动引用计数)
我的理解(纠正我,如果我错了):
weak
属性的行为与assign
属性类似,不同之处在于,当属性指向的实例被破坏时,ivar会指向nil。
问:
- 我只是觉得
weak
属性的getter保留并自动释放。是不是想表现得像在assign
财产的getter设置吸气剂不保留,并自动释放(请参阅程序)
计划:
我已经计划如下与实际产出和我的预期产出。
注意 - 当我改变从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
感谢
感谢您的答复保留, 我有个疑问。纠正我,如果我错了 - 使用弱财产的目的是确保寿命不增加,只要使用它,只要所有者不摧毁它。如果要延长生命期,是否会违背使用弱指针的目的? – user1046037
@ user1046037我已经更新了我的答案,并附有一个ARC规范的链接,明确说明了这种行为。 – hamstergene
@ user1046037属性上的'weak'只是'@ synthesize'的一条指令。你正在观察的行为是由于'__weak'读取语义导致的:你不能将weak转换为'unsafe_unretained'指针,因为它的生命周期可能在任何时候结束,你必须在使用它之前保留该对象。 – hamstergene