问题标签 [unsafe-unretained]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
654 浏览

objective-c - 我应该将 __unsafe_unretained 用于临时变量吗?

假设我想创建一个临时变量,例如:

  1. 指向另一个长期存在的变量:

    /li>
  2. 指向我刚刚创建的对象。

    /li>

这些临时变量不需要保留,因为只要临时变量在范围内,就可以保证它们指向的对象保持正保留计数。那么,我应该将它们声明为__unsafe_unretained吗?

0 投票
2 回答
3087 浏览

objective-c - 如何管理 unsafe_unretained ivars/properties?

几周前我开始使用objective-c和iOS(值得牢记),我提前为糟糕的图表道歉!

在此处输入图像描述

上图显示了我对 Web 服务的调用的结构。细箭头表示对象创建另一个对象,而粗箭头表示对象持有对指向对象的强(保留)引用。

我相信这包含所谓的“循环引用”,并且在释放对象时会产生问题。

我知道简单的答案是替换一些对弱引用的强引用,我很乐意这样做,除了我的项目也针对 iOS 3.2(不是我的决定——我真的无法改变这个事实!) . 所以,我认为我说我必须使用 __unsafe_unretained 是对的,但我很担心这些不会自动归零,因为当对象被释放时我会遇到 EXC_BAD_ACCESS 问题。 ..

所以我的问题首先是我有循环引用。要解决,我将不得不使用 __unsafe_unretained,这导致了我的第二个问题:如何正确管理这些?

一个可能相关的问题是: NSURLConnection 如何管理它的强引用?我从各种渠道听说它保留了它的代表?所以...如果我保留一个 NSURLConnection(并且也是它的代表)并且它保留了我,这也将是一个循环引用,不是吗?它如何解决我的问题?

非常欢迎任何建议!

问候,尼克

0 投票
1 回答
1781 浏览

objective-c - 使用双间接指针分配将项目转换为 ARC

我正在尝试将项目转换为 ARC。该项目有一个有向无环字图,这基本上意味着到处都有很多双间接指针。

事实证明,转换为 ARC 是一项相当大的挑战,尤其是一个问题让我目前感到困惑。

这是场景。

假设你有一个NSString *

您还有一个双重间接类型:

您想将一个分配给另一个,如下所示:

这给出了一个转换错误:

更改b__unsafe_unretained不起作用。我也尝试过各种桥接演员。我在这里遗漏了一些明显的东西吗?

有任何想法吗?

谢谢!

0 投票
1 回答
960 浏览

objective-c - ObjC自动引用计数(ARC):弱vs分配vs unsafe_unretained代表?

我有一堂课:

和实施:

当我为 ARC 重构代码时,它告诉我只允许在 ARC/GC 模式下合成“弱”属性。但据我所知,委托在 ARC 中可能是“弱”的,而且,如果我将其更改为分配,那么它将被转换为 unsafe_unretained。

我的问题是,这是否意味着转换(到 ARC)之前的代码不应该使用任何 ARC?

谢谢!

0 投票
1 回答
109 浏览

ios4 - 升级到 ARC 后的委托指针问题

我刚刚将我的应用程序升级到 ARC,但我在处理带委托的类时遇到了问题。因为我的目标是 iOS 4.0 及更高版本,所以我使用__unsafe_unretained@property (unsafe_unretained)存储委托指针。

但是,我现在发现的是,我在视图控制器中创建的服务(包括委托)在我删除该视图控制器后现在仍然存在,这导致在它之后尝试与视图控制器(委托)进行通信已被释放...因此在启用 Zombies 时出现错误。

如何在视图控制器或服务中更新我的代码,以便当视图控制器被删除(从导航控制器堆栈中弹出)时,带有委托指针的服务也会从内存中删除?

0 投票
2 回答
826 浏览

objective-c - 支持iOS 4.3,使用“assign”而不是weak,但是Interface Builder使用unsafe_unretained?

要使用 ARC 支持 iOS 4.3,我认为正确的方法是使用assign

那是对的吗?我还在Apple 的 Transitioning to ARC 文档中看到以下内容:

对于声明的属性,你应该使用assign而不是weak;对于变量,您应该使用 __unsafe_unretained 而不是 __weak。

但是,如果我使用当前的 Xcode (4.4.1),将 Single View 应用程序目标更改为 4.3,然后按住 Ctrl 键将 UIButton 拖到.h文件中以创建插座,则生成的代码为:

为什么有区别,应该使用哪一个?

0 投票
1 回答
1190 浏览

objective-c - 将 __unsafe_unretained 指针返回到 Objective C 中释放的对象会导致崩溃

问题

我有一个__unsafe_unretained id指向已发布对象的指针。到目前为止一切顺利,只要我根本不“使用”指针(特别是,我不通过指针调用任何方法)。但是,当我尝试从方法返回其值时,它会崩溃,即使我已明确指定返回值具有 type __unsafe_unretained id。这是为什么?我想如果我使用__unsafe_unretained,它根本不会调用retain/ release/之类的方法autorelease吗?我想我可以使用__unsafe_unretained id它,就好像它是一个void*(意味着它只做简单的本地作业)?

环境

  • 发展于Xcode 4.4.1
  • 使用iOS SDK 5.1
  • ARCenabled
  • 运行iPhone 4.3 / 5.0 / 5.1 SimulatoriPhone 4.3 Device
  • 两者都崩溃DebugRelease构建

源代码

调用堆栈(iPhone 4.3 模拟器/iOS 4.3 设备):

调用堆栈(iPhone 5.0/5.1 模拟器):

0 投票
2 回答
118 浏览

objective-c - 在没有弱属性的 IOS 4.0 中使用 ARC 真的是一个不错的选择吗

我正在做一个基于 ARC 的项目。我的项目针对 IOS 4.3。由于版本 < IOS 5.0 没有弱指针,我必须使用unsafe_unretained可能会导致悬空指针。

现在我在想,将 ARC 与 unsafe_unretained 一起使用真的是很好的选择吗?或者我应该切换回手动内存管理,因为我的项目是针对 IOS 4.3 的。?

如果在我的情况下使用 ARC 是一个不错的选择,我应该在哪里将 unsafe_unretained 属性设置为 nil?我见过人们在 viewDidUnload 中这样做,但在正常情况下永远不会调用 viewDidUnload。任何帮助是极大的赞赏。

0 投票
3 回答
401 浏览

objective-c - 指向 NSStrings 指针的二维数组的 ivar 的属性

我想创建一个包含指向 NSStrings 指针的动态二维 c 数组的类。我知道我可以使用包含多个 NSArray 的 NSArray 来模拟二维数组,但如果可能的话,我想使用传统的二维 c 数组来模拟二维数组。除非您使用“__unsafe_unretained”,否则 ARC 不允许将指向 NSString 的指针简单分配给 c 数组的元素:

为了避免内存泄漏并在分配给 c-array 的每个 NSString 的类中赋予对象所有权,我将指向每个 NSString 对象的指针添加到 NSMutableArray。在 -(void)dealloc 中,我释放了获取的内存以创建二维 c 数组。

这是我的问题:如何根据 _array ivar 声明一个属性,以便我可以将数组的 i,j 元素称为“foobar.array[i][j]”而不是“foobar->array[i ][j]”?

后来的放大:除了 __bridge 的东西外,我以与回答者非常相似的方式完成了它。我不知道这是否有区别。我在这里分配二维数组:

我使用从逗号分隔值文件生成的子字符串将指向 NSString 对象的指针放入数组中:

在 -(void)dealloc 我释放所有内存:

0 投票
2 回答
292 浏览

ios - 带有 __unsafe_unretained 类型转换的 malloc 对象生命周期

我是 Objective-C 和 ARC 的新手,并且已经搜索和阅读了几个小时而没有找到答案。代码做了我想让它做的事情,但我想知道它不依赖于有利条件。这是我的代码的简化版本:

我对分配的结构无能为力。它由objc_getClassList填充。不幸的是,Apple 似乎没有更新他们的文档来解释如何在 ARC 下执行此操作。上面的类型转换部分是通过查看示例来构思的,但它仍然让我感到紧张。

我担心的一个问题是,如果我为“常规”对象分配空间,那么dealloc当变量超出范围时就会被调用,这会在free调用之后发生。但我不认为这正是这里发生的事情。

  • 行为是否Class与其他种类的 Objective-C 数据类型不同?我应该期待别的东西吗?
  • 什么样的指针是classes?我猜它引用了一个未知大小的数组(一个非对象指针),但 ARC 仍然关心它,因为没有该强制转换代码将无法编译。它看起来像一个强指针,但我不知道它会是一个强指针。
  • 是否存在指向数组中对象的强指针,或者对象本身是否是强指针?如果没有,ARC 是否仍然有效,或者我应该恢复到某些 MRC 约定?
  • 会有自动呼叫dealloc吗?编译器何时以及如何确保这种情况发生?
  • classes设置为更好的做法NULL,然后才调用到free?或者我应该遍历数组并对每个对象做一些事情,比如将它们设置为nil