关于C#:__ weak,__block和__assign之间有什么不同?

Different among __weak, __block and __assign?

本问题已经有最佳答案,请猛点这里访问。

1)维基百科说:"弱(weak)和赋值(assign)的区别在于,当变量指向的对象被释放时,变量的值是否会改变。弱的将更新为零,分配的将保持不变,作为悬空指针。"

但我在Xcode中尝试过这样的示例之后

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

如果wiki是正确的,那么obj1所指的地址在发布后必须是nill。但是obj1所指的地址仍然是0xabcdef...。维基错了?

2)帮助我区分__weak, __block, __assign


"归零弱引用"的__weak属性只能与arc(自动引用计数)一起使用。

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

1
__weak attribute cannot be specified on an automatic variable when ARC is not enabled [-Wignored-attributes]

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

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

1
assigning retained object to weak variable; object will be released after assignment [-Warc-unsafe-retained-assign]

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