Ios __非ARC项目中使用的强限定符
该项目未启用ARC,但我们(错误地)使用了符合ARC的代码库,特别是用于创建单例对象的代码库,如GCDSingleton.h中定义的:Ios __非ARC项目中使用的强限定符,ios,objective-c,automatic-ref-counting,Ios,Objective C,Automatic Ref Counting,该项目未启用ARC,但我们(错误地)使用了符合ARC的代码库,特别是用于创建单例对象的代码库,如GCDSingleton.h中定义的: #define DEFINE_SHARED_INSTANCE + (id)sharedInstance { static dispatch_once_t pred = 0; __strong static id _sharedObject = nil; dispatch_once(&pred, ^{ _sharedObject = ^
#define DEFINE_SHARED_INSTANCE
+ (id)sharedInstance
{
static dispatch_once_t pred = 0;
__strong static id _sharedObject = nil;
dispatch_once(&pred, ^{
_sharedObject = ^{return [[self alloc] init];}();
});
return _sharedObject;
}
即使共享对象是用一个_强限定符定义的,这似乎仍然有效。我想知道为什么这不会导致错误或至少是警告(最新的Xcode 4.6和ios 6 sdk)。此外,由于项目未启用ARC,因此在MRC代码中,
\uu strong
完全忽略了该限定符到底在做什么
我试着编译一个简单的例子
#import <Foundation/Foundation.h>
int main(int argc, char const *argv[]) {
__strong NSString * foo = [[NSString alloc] initWithFormat:@"Hello, %s", argv[1]];
NSLog(@"%@", foo);
}
无弧
clang -fno-objc-arc test.m -S -emit-llvm -o mrc.ir
以及区分llvm IR输出
以下是diff mrc.ir arc.ir
54a55,56
> %17 = bitcast %0** %foo to i8**
> call void @objc_storeStrong(i8** %17, i8* null) nounwind
63a66,67
> declare void @objc_storeStrong(i8**, i8*)
>
因此,基本上,ARC和MRC之间的唯一区别是添加了一个objc\u storeStrong
调用
顺便说一下,没有
\uuuu strong
限定符的相同代码将产生相同的精确结果,因为\uuuu strong
是ARC中变量的默认限定符。谢谢。这也是我所想的——否则我至少会预期由于解除分配对象而导致编译错误或segfaults。为什么?您正在(以一种有趣的方式-为什么定义thunk并调用它?)将一个带有+1 retain计数的对象分配给一个永远不会超出范围的静态变量。没有撞车,你误会了。我的意思是,如果它没有按预期工作,那么有什么东西导致它被解除分配,这是不可能的。无论如何,这里没有问题。
54a55,56
> %17 = bitcast %0** %foo to i8**
> call void @objc_storeStrong(i8** %17, i8* null) nounwind
63a66,67
> declare void @objc_storeStrong(i8**, i8*)
>