Objective-C ARC:强与保留,弱与分配

2024-02-20

ARC 引入了两个新的内存管理属性,strong and weak.

除了copy,这显然是完全不同的东西,之间有什么区别吗strong vs retain and weak vs assign?

根据我的理解,这里唯一的区别是weak将分配nil到指针,同时assign不会,这意味着当我在释放指针后向指针发送消息时,程序将崩溃。但如果我使用weak,这永远不会发生,因为消息发送到nil不会做任何事。

我不知道之间有什么区别strong and retain.

我有什么理由应该使用assign and retain在新项目中,还是正在被弃用的类型?


在阅读了这么多文章 Stackoverflow 帖子和演示应用程序来检查可变属性属性后,我决定将所有属性信息放在一起:

  1. 原子//默认
  2. 非原子的
  3. 强=保留//默认
  4. weak
  5. retain
  6. 分配//默认值
  7. __unsafe_unretained
  8. copy
  9. readonly
  10. 读写 //默认

下面是详细的文章链接,您可以在其中找到上述所有属性,这肯定会对您有所帮助。 非常感谢所有在这里给出最佳答案的人!

iOS 中的可变属性属性或修饰符 http://rdcworld-iphone.blogspot.in/2012/12/variable-property-attributes-or.html

1.strong(iOS4=保留)

  • 它说“将其保留在堆中,直到我不再指向它”
  • 换句话说,“我是所有者,你不能在与保留相同的目标之前释放它”
  • 仅当需要保留对象时才使用强。
  • 默认情况下,所有实例变量和局部变量都是强指针。
  • 我们通常对 UIViewControllers(UI 项的父级)使用 Strong
  • Strong 与 ARC 一起使用,它基本上可以帮助您,因为不必担心对象的保留计数。当你使用完它后,ARC会自动为你释放它。使用关键字strong意味着你拥有该对象。

Example:

@property (strong, nonatomic) ViewController *viewController;

@synthesize viewController;

2.weak -

  • 它说“只要其他人强烈指出它,就保留它”
  • 与分配相同,没有保留或释放
  • “弱”引用是您不保留的引用。
  • 我们通常对IBOutlets(UIViewController Child's)使用weak。这是有效的,因为只要父对象存在,子对象就需要存在。
  • 弱引用是不能保护引用对象不被垃圾收集器收集的引用。
  • 弱本质上是分配,一个未保留的属性。除了当对象被释放时,弱指针会自动设置为 nil

例子 :

@property (weak, nonatomic) IBOutlet UIButton *myButton;

@synthesize myButton;

强弱解释,感谢 BJ 荷马 https://stackoverflow.com/a/9262768/19679:

想象我们的对象是一只狗,而狗想要逃跑(是 解除分配)。

强指针就像是狗身上的皮带。只要你有 给狗拴上皮带,狗就不会逃跑。如果五个人 将皮带拴在一只狗身上(五个强指针指向一个物体), 然后,在五个皮带全部松开之前,狗不会逃跑。

另一方面,弱指针就像小孩子指着 狗并说“看!一只狗!”只要狗还在 拴着皮带,小孩子们仍然可以看到狗,他们仍然会指着 到它。然而,一旦所有的皮带都被松开,狗就会逃跑 无论有多少小孩子指着它,它都会消失。

一旦最后一个强指针(皮带)不再指向 对象,该对象将被释放,所有弱指针将被释放 归零。

我们什么时候用弱呢?

唯一需要使用weak的时候是如果你想避免引用循环 (例如,父级保留子级,子级保留父级,因此两者都不会被释放)。

3.保留=强大

  • 它被保留,旧值被释放并被分配保留指定应发送新值
  • 保留分配和发送的旧值 -release
  • 保留与坚强相同。
  • 苹果说,如果你写保留,它会自动转换/仅像强一样工作。
  • 像“alloc”这样的方法包含隐式的“retain”

Example:

@property (nonatomic, retain) NSString *name;

@synthesize name;

4.assign

  • 分配是默认值,仅执行变量分配
  • allocate 是一个属性属性,它告诉编译器如何综合属性的 setter 实现
  • 我将使用 allocate 来表示 C 基元属性,使用weak 来表示对 Objective-C 对象的弱引用。

Example:

@property (nonatomic, assign) NSString *address;

@synthesize address;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Objective-C ARC:强与保留,弱与分配 的相关文章

随机推荐

  • 如何使用 CSS 设置占位符值?

    我想仅使用 CSS 设置输入框的占位符值 而不使用 JavaScript 或 jQuery 我怎样才能做到这一点 AFAIK 你不能单独使用 CSS 来做到这一点 CSS有content但即使如此 也可以使用伪选择器在元素之前或之后插入内容
  • 在 Windows XP 登录屏幕 (.NET / Pinvoke) 上运行进程(使用 GUI)

    我需要写一个小service运行一个应用程序 使用 GUI 例如calc exe 在登录屏幕上 我已经找到这个问题 和答案 在 Windows 7 欢迎屏幕上运行进程 https stackoverflow com questions 30
  • 如何组合数据框中的连续数据并累加值

    我有一个数据框 Type Volume Date Q 10 2016 6 1 Q 20 2016 6 1 T 10 2016 6 2 Q 10 2016 6 3 T 20 2016 6 4 T 20 2016 6 5 Q 10 2016 6
  • 如何使用 _this_ Jeditable 获取被操纵的 dom 元素的值?

    这是一个延续Jeditable 如何根据dom元素属性设置参数 https stackoverflow com questions 1255596 请在这里回复 这是我的 真实 帐户 我正在尝试将不同的参数值分配给启用了 jQuery 插件
  • 使用 matlab 创建跨图像边界的强度带

    I have this image 8 bit pseudo colored gray scale 我想在其边界周围创建一个特定度量的强度带 我尝试了腐蚀和其他数学运算 包括过滤以实现所需的频带 但一旦我使用腐蚀来切割部分边界 实际图像强度
  • 如何在 Postgresql 中提取子字符串模式

    我有一列包含很多不一致的字符串 其中一些包含具有一致模式的子字符串 2015mmdd AB CD EFG text text HIJ 我想提取它 我觉得这是正则表达式和子字符串命令的交叉情况 到目前为止我最好的方法是相当丑陋的 substr
  • NSURLSession,上传任务 - 获取传输的实际字节数

    我收到错误报告 称我的 iOS 应用程序在连接速度较慢时无法上传图像 虽然我的超时可能不够长 但还有另一个问题 我发现上传进度很快就达到 100 尽管我可以在 Charles 中看到字节仍在传输 我使用 NSURLSession 的以下方法
  • “nice”是否影响Java线程的优先级[重复]

    这个问题在这里已经有答案了 在 Unix 系统上 您可以以较低的 CPU 优先级 运行进程 迂腐地说 它不会改变所谓的 优先级 priority 而是影响可用 CPU 时间的使用份额 这是一般意义上的 优先级 使用nice命令 nice p
  • 如何在pytorch中打印Adadelta中的“实际”学习率

    In short 在 pytorch 中使用 adadelta 优化器时 我无法绘制 lr epoch 曲线 因为optimizer param groups 0 lr 始终返回相同的值 详细 Adadelta 可以仅使用一阶信息随时间动态
  • jquery mobile - 附加 html 内容并应用 JQuery mobile 的样式

    我有一个移动网站 它是通过附加 XML 提要中的数据创建的 最初加载提要及其所有数据 然后当用户浏览站点时从数组中获取正确的提要内容 以前的内容从 div 中清除 并应用新内容 我试图在附加新内容时向 jquery mobile 调用某种
  • 如何从 bash 读取参数[重复]

    这个问题在这里已经有答案了 我很好奇如何通过终端将参数传递到 bash 脚本并读取它们并根据参数处理脚本函数 所以如果我做了类似的事情 scriptname sh install or scriptname sh assets instal
  • Perl 模块 HTML::Template 可以使用除 之外的其他语法吗?

    我正在尝试利用Perl module HTML Template根据文档 它说你可以使用HTML注释而不是标记周围的大于 小于 但它对我不起作用 来自 HTML Template 的 perldoc 如果您热衷于有效的 HTML 并且希望您
  • OCI 运行时执行失败:container_linux.go:344:启动容器进程导致“没有这样的文件或目录”:未知

    我正在运行示例教程Hyperledger Fabric 文档 https hyperledger fabric readthedocs io en release 1 4 html 尝试使用以下命令运行 构建您的第一个网络 示例 byfn
  • Vue 3 - 访问路由器视图实例以调用子方法

    我正在尝试将 Vue 2 x 应用程序迁移到 Vue 3 x 不幸的是 在过去的两天里 我正在努力寻找解决这个简单问题的方法 我的应用程序适用于移动设备 在屏幕顶部有一个顶部栏 左侧和右侧有 2 个上下文按钮 这些按钮触发与我的视图中加载的
  • 带有粘性标题的 flutter DraggableScrollableSheet

    我正在我的 flutter 应用程序中实现 DraggableScrollableSheet 并希望有一个粘性标题 即只有列表视图滚动 并且工作表的顶部始终保持在原位 我的小部件看起来像这样 SizedBox expand child Dr
  • Scintilla 中的交替行着色

    我在用着wxStyledTextCtrl http wiki wxwindows org WxStyledTextCtrl来自 wxPython 一个围绕闪烁体 http www scintilla org 成分 有什么方法可以在其上获得替
  • Lua 中的 OOP - 创建类?

    我知道这个网站上有一些关于在 Lua 中实现 OOP 的问题 但是 这个问题有点不同 至少与我发现的相比 我正在尝试创建一个名为 human 并使其使用 人类 的 新 构造函数创建的对象继承人类内部的所有内容 除了它的构造函数 但是 我也不
  • 如何使用 TypeScript 定义 DynamoDB get 的返回类型?

    I have let resItem Schema resItem await dynamoClient get TableName Key uuid request body uuid promise 但我得到 Type PromiseR
  • WPF 弹出窗口 IsOpen 问题

    使用发现的概念在 StackOverflow 上 https stackoverflow com a 8946055 24399 请注意 ToggleButton IsHitTestVisible一定会Popup IsOpen with S
  • Objective-C ARC:强与保留,弱与分配

    ARC 引入了两个新的内存管理属性 strong and weak 除了copy 这显然是完全不同的东西 之间有什么区别吗strong vs retain and weak vs assign 根据我的理解 这里唯一的区别是weak将分配n