Ios __非ARC项目中使用的强限定符

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 = ^

该项目未启用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 = ^{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*)
>