前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >iOS内存管理(四)-strong&copy&weak底层分析

iOS内存管理(四)-strong&copy&weak底层分析

原创
作者头像
用户6658895
修改2023-07-24 11:35:56
2630
修改2023-07-24 11:35:56
举报

常见关键字

  • 内存管理有关的关键字:weak,assign,strong,retain,copy
  • 线程安全有关的的关键字:nonatomic,atomic
  • 访问权限有关的的关键字:readonly,readwrite(只读,可读写)
  • 修饰变量的关键字:const,static,extern

strong & copy & weak 底层分析

在LGPerson中我们定义了两个两个属性,分别用copy和strong修饰

image
image
objc_setProperty
  • 如果是atomic & copy修饰,name为objc_setProperty_atomic_copy
  • 如果是atomic 且没有copy修饰,name为 objc_setProperty_atomic
  • 如果是nonatomic & copy 修饰,name为 objc_setProperty_nonatomic_copy
  • 其余组合,统一为name = objc_setProperty_nonatomic
image
image
objc_storeStrong
代码语言:txt
复制
void
objc_storeStrong(id *location, id obj)
{
    id prev = *location;
    if (obj == prev) {
        return;
    }
    objc_retain(obj);//retain新值
    *location = obj;
    objc_release(prev);//release旧值
}

分析:

  • obj新值引用计时器加1
  • 当前的指针指向新值,更新指针
  • 旧值引用计数器减1
总结:
  • copy和strong修饰的属性在底层编译的不一致,主要还是llvm中对其进行了不同的处理的结果。copy的赋值是通过objc_setProperty,而strong的赋值时通过self + 内存平移(即将指针通过平移移至name所在的位置,然后赋值),然后还原成 strong类型
  • strong & copy 在底层调用objc_storeStrong,本质是新值retain,旧值release
  • weak 在底层调用objc_initWeak

常见问题:

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 常见关键字
  • strong & copy & weak 底层分析
  • 常见问题:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档