拥有手动引用计数的所有权修饰符

时间:2014-04-19 14:22:16

标签: objective-c

当您使用Objective-C onwership修饰符(__strong, __weak, __unsafe_unretained)和手动引用计数时会发生什么?他们中的任何一个修改行为都被忽略了吗?

1 个答案:

答案 0 :(得分:3)

clang -E -dM显示了内置宏的定义:

$ clang -E -dM -x objective-c /dev/null | egrep  "weak|strong|unsafe"
#define __strong 
#define __unsafe_unretained 
#define __weak __attribute__((objc_gc(weak)))

如您所见,__strong__unsafe_unretained被定义为空宏, 并且__weak被定义为(据我所知)只与...相关的东西 (不再支持)垃圾收集环境。

简而言之:所有权修饰符忽略,带有手动参考计数。这是有道理的,因为 负责维护引用计数。

情况与属性略有不同:

@property(strong) id x;            // same as "retain"
@property(weak) id y;              // syntax error with MRC
@property(unsafe_unretained) id z; // same as "assign"

仅仅为了完整起见:使用ARC,内置所有权修饰符 宏定义如下:

$ clang -E -dM -x objective-c -fobjc-arc /dev/null | egrep  "weak|strong|unsafe"
#define __strong __attribute__((objc_ownership(strong)))
#define __unsafe_unretained __attribute__((objc_ownership(none)))
#define __weak __attribute__((objc_ownership(weak)))