【问题标题】:converting an non ARC project to ARC将非 ARC 项目转换为 ARC
【发布时间】:2012-09-17 06:18:24
【问题描述】:

我有一个 Xcode 3.2 目标项目。我想将此项目转换为 ARC 以改进

性能。我正在执行这些步骤。

编辑->重构->转换为Objective C ARC

我有一些 .mm 文件,我正在使用 -fno-objc-arc 禁用 ARC。但即使在

我收到很多错误(ARC 问题)。例如,主要在 self=[super init] 调用中,

错误是不能在 init 系列中的方法之外分配给 self。可以

有人告诉我我的步骤是否正确吗?

【问题讨论】:

    标签: objective-c ios5 automatic-ref-counting


    【解决方案1】:

    我试图将一个项目转换为 ARC,并在创建一个新项目并包含旧项目的文件后 - 我遇到的问题之一是

    不能在 init 系列中的方法之外分配给“self”

    选择器名称必须以 init 开头 - 不仅如此 - 在我的例子中,初始化选择器是:

    -(id)initwithPage:(unsigned)pageNum {...}
    

    注意小“w”。

    我已经改成:

    -(id)initWithPage:(unsigned)pageNum {...}
    

    注意大写的“W”!

    我的问题解决了。

    我希望这对某人有所帮助。

    【讨论】:

    • 即使我在我的 XCode 中也观察到了它。
    • 附加说明:LLVM 的文档中提到(尽管非常微妙):“如果忽略任何前导下划线,选择器的第一个组件完全由方法族的名称或以该名称开头,后跟一个字符不是小写字母。"
    • 并且不要忘记 -(id) 返回值!
    【解决方案2】:

    Ray Wenderlich 的教程有一个非常好的 ARC 转换两部分教程,其中应该详细说明要采取的正确步骤:Part 1Part 2

    就您遇到的错误而言,描述几乎总结了它:您分配给self 的方法不符合the standard for init methods。我不能说这是否是 ARC 之前的合法,但它肯定不再是了。要解决这个问题,要么将其设为 init 方法(遵循将超级 init 方法调用到 self、初始化任何值并返回 self 的 init 实践),要么在其中取出对 self 的赋值。对于其他错误,请发布您遇到的任何问题(其中许多都包含在 Ray 的教程中),我们将尽我们所能。

    【讨论】:

    • 这是完全合法的,但问题是:在什么情况下,您希望在 init 方法之外分配 self?
    • 他的方法完全有可能具有初始化风格的行为,但根本没有返回初始化对象(即调用 obj = [Obj alloc]; [obj initWithData]; 而 initWithData 返回 void)。因为 init 方法必须返回一个指针,所以它在 ARC 之前可以正常工作,但在转换时会导致大量问题。幸运的是,如果仅此而已,那应该只是更新声明的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    相关资源
    最近更新 更多