• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - __strong 非 ARC 项目中使用的限定符

[复制链接]
菜鸟教程小白 发表于 2022-12-13 04:01:47 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

该项目未启用 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;
}

即使共享对象是用 __strong 限定符定义的,这似乎也有效。我想知道为什么这不会导致错误或至少不会导致警告(最新的 Xcode 4.6 和 ios 6 sdk)。此外,由于该项目未启用 ARC,那么 __strong 限定符到底在做什么(如果有的话)?



Best Answer-推荐答案


在 MRC 代码中,__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 -fobjc-arc test.m -S -emit-llvm -o arc.ir

没有ARC

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_storeStrong 调用。


顺便说一下,没有 __strong 限定符的相同代码将产生完全相同的结果,因为 __strong 是 ARC 中变量的默认限定符。

关于ios - __strong 非 ARC 项目中使用的限定符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18609935/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap