问题标签 [automatic-ref-counting]

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 投票
2 回答
6086 浏览

iphone - Objective-C ARC 错误:-fobjc-arc 不支持脆弱的 abi

我在尝试将我的 iPhone 应用程序迁移到新的 ARC 技术时遇到问题。当我尝试转换代码时,出现以下错误 29 次:

这是什么意思?更重要的是,我该如何解决?提前致谢!

0 投票
1 回答
372 浏览

ios - ARC下[UITableView _setupTableViewCommon]内存泄漏

我正在使用带有 ARC 的 XCode 4.2(beta 4)提供的 iOS Master/Detail 模板进行内存管理,为 iOS 4.3 目标编译。

Instruments 报告说我的代码一切正常,但是 UITableView 中的 UIKit 内部任务“_setupTableViewController”有 2 x 32 字节泄漏。

这是我在提交我的应用程序进行评估之前需要担心的事情吗?如果是这样,任何有关如何跟踪和修复的提示都受到欢迎,因为调用树说问题出在 dynlib 的 class_createInstance 中!

0 投票
19 回答
185473 浏览

ios - performSelector 可能会导致泄漏,因为它的选择器是未知的

我收到 ARC 编译器的以下警告:

这就是我正在做的事情:

为什么我会收到此警告?我知道编译器无法检查选择器是否存在,但为什么会导致泄漏?以及如何更改我的代码以便不再收到此警告?

0 投票
3 回答
17830 浏览

iphone - 声明委托 ivar 时出现 ARC 错误

我正在使用 ARC(不,这不是 NDA)。我在我的界面中声明我的 ivar

然后我声明属性:

@property (nonatomic, weak) id<mySecretDelegateYouAreNotSupposedToSeeOnSO> itemDelegate;(因为 ARC 而用弱而不是分配)

在我的实现文件中,我只是合成它:@synthesize itemDelegate;

但是,我收到错误:

有谁知道怎么了?谢谢你的帮助。

ARC - 自动引用计数

0 投票
3 回答
85699 浏览

objective-c - ARC 和桥接铸件

使用 ARC,我无法再CGColorRef转换为id. 我了解到我需要进行桥接演员表。根据clang 文档

桥接强制转换是使用以下三个关键字之一注释的 C 样式强制转换:

(__bridge T) op将操作数强制转换为目标类型T。如果T 是可保留对象指针类型,则op必须具有不可保留指针类型。如果T是不可保留的指针类型,则 op 必须具有可保留的对象指针类型。否则,演员阵容不正确。没有所有权转移,ARC 没有插入保留操作。

(__bridge_retained T) op将必须具有可保留对象指针类型的操作数强制转换为目标类型,该目标类型必须是不可保留指针类型。ARC 保留该值,但需对本地值进行通常的优化,并且接收者负责平衡该 +1。

(__bridge_transfer T) op将必须具有不可保留指针类型的操作数强制转换为目标类型,该目标类型必须是可保留对象指针类型。ARC 将在封闭的完整表达式的末尾释放该值,这取决于对局部值的通常优化。

需要这些转换才能将对象移入和移出 ARC 控制;请参阅关于可保留对象指针的转换部分的基本原理。

纯粹使用__bridge_retainedor__bridge_transfer强制转换来说服 ARC 分别发出不平衡的保留或释放是不好的形式。

在什么样的情况下我会使用它们?

例如,CAGradientLayer有一个colors接受 s 数组的属性CGColorRef。我的猜测是我应该__brige在这里使用,但究竟为什么我应该(或不应该)尚不清楚。

0 投票
4 回答
4623 浏览

objective-c - 我正在使用 ARC 在 Objective-C 中编写一个 Button 类——如何防止 Clang 在选择器上出现内存泄漏警告?

我正在编写一个简单的按钮类,如下所示:

我从 Clang 收到以下警告[object performSelector:action]

经过一些研究,我发现选择器可以属于具有不同内存要求的系列。目的是让动作返回无效,因此它不应该导致任何 ARC 困难并且应该适合none家庭。

看起来我想要的相关预处理器代码是,或者是以下的变体:

但是我在哪里可以告诉 Clang 不要担心呢?

0 投票
2 回答
3979 浏览

objective-c - 带有ARC的Objective-C:自定义设置器不保留

注意:这是由于一些 XCode beta 版本中的一个 bug 导致的,这个 bug 早已被修复。如果您对 ARC 有疑问,此问答可能对您没有帮助。


我正在将我的项目从手动引用计数迁移到 ARC,并且偶然发现了一个问题:如何确保保留属性的自定义设置器实际保留?

myClass.h中,我声明了一个属性:@property (retain) NSDate *date。我是手动设置__strongivar 还是让它自动生成都没有关系。

在实现中,我当然有@synthesize date,并实现了一个自定义设置器(或者只是下载演示 Xcode 项目):

这似乎没有保留日期,并message sent to deallocated instance在 newName (自动)发布它来自的地方,myClass.date稍后尝试访问时给我(假设 Zombie 已启用;否则,它只是默默地崩溃)。

更改要使用的设置器可以date = [newDate copy]解决该错误,但这并不是我真正想要的。删除自定义设置器也可以,但显然是不可取的。

我在这里想念什么?如何确保保留属性的自定义设置器实际上保留在 ARC 环境中?这似乎是一项基本和常见的任务,我认为我忽略了一些非常明显的事情。

(注意:这不属于任何 Apple NDA 的条款,因为 ARC 作为 LLVM 的一部分公开发布)

编辑:我创建了一个小型 Xcode 项目来演示该问题并将其上传到 github。随意下载并玩。我已经束手无策了(尽管我的机智今天不是最好的,诚然)。

编辑:对于此示例项目,此问题已解决(请参阅接受的答案)。不幸的是,在我无法自由分享的更大项目中,问题仍然存在。作为一种解决方法,我添加strong了带有合成设置器的重复属性(ivars 不起作用)。新的自定义设置器现在看起来像这样:

0 投票
3 回答
595 浏览

objective-c - Cocoa Touch NSArray 初始化无法正常工作

我有几个在我的 -viewDidLoad 方法中初始化的 ivar NSArray。一个包含字符串,一个包含 IBOutlets。但是,当我初始化时,数组中的所有对象都超出了范围,并且内存地址为 0x0(根据 Xcode 调试器)。但是,当我有一个具有相同对象的本地 NSArray 时,它可以正常工作。初始化 ivar NSString 或 NSDictionary 都可以正常工作。

编码:

当我尝试使用该数组时,我得到一个 EXC_BAD_ACCESS 运行时错误。这是一个 Xcode 错误,还是我错过了一些关于 NSArray 的东西?更新:我正在使用 ARC。在我关闭 ARC 并进行干净的构建后,我不再遇到这个问题。这是ARC中的错误吗?

我不知道问题出在哪里,但我切换到了稳定版本的 Xcode (4.0.2) 并且完全没有问题。感谢大家尝试提供帮助!

0 投票
2 回答
3378 浏览

objective-c - 我应该在objective-c中使用ARC吗?

查看 OS 10.7 的发行说明,有一些关于使用自动引用计数 (ARC) 来简化内存管理的内容。我即将开始一个新的 Cocoa 项目,想知道是否值得使用该模型(按照我的理解,你不能在使用 ARC 和不使用它之间混用)?

困境似乎是使用新的东西而不是使用可能在以后节省大量调试时间的东西。但真的是这样吗?有没有人玩过它并没有发现现实世界的好处?

0 投票
3 回答
3066 浏览

iphone - 在没有调用跟踪的情况下过度释放(使用 ARC),主要访问错误

我最近转换为使用 ARC。但是,我现在遇到了奇怪的崩溃,并且崩溃日志真的没有帮助。在我的一个应用程序初始化过程中(从服务器获取数据,解析它,设置视图),我得到一个 bad_access。这是来自设备的错误日志:

等等,我相信这是唯一有用的部分。当我让它在 XCode 中运行崩溃时,我看到它在 main 中崩溃,除了 main、UIApplicationMain 和 CFRelease 之外,我看不到任何调用跟踪。

过去,我会查看我的代码是否过度释放对象,但我怀疑是这种情况,因为我现在使用的是 ARC。你如何修复这样的错误?

编辑:解析数据的代码位于使用 GCD 的单独线程上,这就是我唯一的 @autoreleasepool 所在的地方。

此外,当使用 NSZombieEnabled 运行时,我收到了 NSArrayM 发布调用。不幸的是,这与我们在崩溃日志中看到的相同,所以恐怕这里仍然没有真正的进展......

编辑:好的。一旦我在没有 ARC 的情况下修复了所有其他内存错误,我又遇到了这个错误。所以显然它与ARC无关......