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