gpt4 book ai didi

objective-c - 理解弱引用

转载 作者:太空狗 更新时间:2023-10-30 03:48:57 25 4
gpt4 key购买 nike

我有以下启用 ARC 的代码

@property (nonatomic, weak) NSArray *a;
- (void)viewDidLoad
{
[super viewDidLoad];
self.a = @[@1, @2];
NSLog(@"ab is %@", self.a); //prints details of array
// Do any additional setup after loading the view, typically from a nib.
}
- (void)didReceiveMemoryWarning
{

[super didReceiveMemoryWarning];
for (id element in self.a) { //empty here
NSLog(@"blah");
}
// Dispose of any resources that can be recreated.
}

这是我唯一使用self.a 的地方。这是我为调试我的一个问题而编写的测试程序。

当我模拟内存警告 self.a 消失?为什么?

最佳答案

为了理解这一点,您必须了解引用计数。在 Objective-C 中,每个对象都有一个引用计数(即对该对象的强引用数)。如果没有强引用,引用计数为 0 并且对象被释放。

self.a = @[@1, @2]; 创建一个自动释放的 NSArray (意味着它将在稍后阶段自动释放)并将其分配给self.a。一旦 autoreleasepool 被耗尽,该数组的引用计数为 0(假设没有其他强引用)并且它被释放。 self.a 作为弱变量会自动设置为 nil。

如果您使用[[NSArray alloc] init] 来初始化您的数组并将其分配给一个弱指针,该对象将在分配后立即释放。在 NSLog 中,a 将为 nil

__weak NSArray* a = [[NSArray alloc] initWithObjects:@"foo", @"bar", nil];
NSLog(@"%@", a);

在 Xcode 4.6 中,编译器会警告您后一种情况。

关于objective-c - 理解弱引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15674320/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com