-1

1)维基百科说:“weak (_weak)和assign( _assign)的区别在于,当变量指向的对象被释放时,变量的值是否会改变。weak的会是更新为 nil 并且分配的将保持不变,作为一个悬空指针。”

但是在我尝试了这样的 Xcode 示例之后

__weak NSObject *obj1 = [[NSObject alloc] init];
[obj1 release];

如果Wiki 是对的,obj1 指向的地址肯定是nill 在release 之后。但是 obj1 指向的地址仍然是0xabcdef... Wiki 的错误?

2)帮我区分__weak, __block, __assign

4

1 回答 1

2

__weak归零弱引用”属性仅适用于 ARC(自动引用计数)。

您的代码显然是使用 MRC(手动引用计数)编译的。在这种情况下,__weak attribute只是被忽略,你应该得到一个编译器警告

未启用 ARC 时,无法在自动变量上指定 __weak 属性 [-Wignored-attributes]

因此,释放对象对变量本身没有影响。obj1它是一个 悬空指针,指向一个已释放的实例。


如果您将代码转换为 ARC,则必须删除该release语句。现在你会得到一个不同的警告

将保留对象分配给弱变量;分配后对象将被释放 [-Warc-unsafe-retained-assign]

该对象将被立即释放并obj1设置为nil,因为在分配之后没有对该对象的强引用。

于 2013-06-30T08:56:52.753 回答