【问题标题】:Converting iOS5 app to ARC将 iOS5 应用程序转换为 ARC
【发布时间】:2011-11-06 18:46:49
【问题描述】:

我正在将一些第三方代码集成到我的应用中,同时尝试将应用转换为 ARC。

我附上一个屏幕截图来显示仅有的两个错误。如果有人知道如何重新编码本节,我将不胜感激。

我还有一个皮塔饼要解决。解决这个问题最务实的方法是什么:

value =  (NSString *)CFURLCreateStringByReplacingPercentEscapesUsingEncoding(kCFAllocatorDefault,
                                                                                             (CFStringRef)value,
                                                                                             CFSTR(" "),
                                                                                             kCFStringEncodingUTF8);

这给出了这个错误:

“将 Objective-C 指针类型 'NSString *' 转换为 C 指针类型 'CFStringRef'(又名 'const struct __CFString *')需要桥接转换”

再次感谢..我会尽快丢失此代码...

【问题讨论】:

    标签: xcode ios5 automatic-ref-counting


    【解决方案1】:

    无论如何你都不应该使用-performSelector:。请改用objc_msgSend(target, selector, ...)。 如果你打电话给-respondsToSelector:,你可以在 if 语句之后使用[vc setDelegate:self.delegate]。第一行也是如此。替换为:

    UIViewController *vc = [vcClass alloc]; // vc = [[vcClass alloc] initWithSomething:[specifier file] ...]; if the initSelector is known at compile time
    

    如果initSelector是动态生成的:

    objc_msgSend(vc, initSelector, [specifier file], ...);
    

    希望这会有所帮助。

    更新:回答第二个问题

    如果您将 CF 对象转移到 Objective-C 对象,ARC 需要知道如何处理内存管理。您必须在演员表之前插入__bridge__bridge_retained__bridge_transfer

    NSString *value;
    value = (__bridge_transfer NSString *)CFURLCreateStringByReplacingPercentEscapesUsingEncoding(kCFAllocatorDefault, (__bridge CFStringRef)value, CFSTR(" "), kCFStringEncodingUTF8);
    

    如果您只想在 CF 和 Objective-C 之间进行转换,则使用 __bridge,如果它是保留值,则使用 __bridge_retained,如果您想将对象从 CF 传输到Objective-C,反之亦然。

    【讨论】:

    • 请注意,我在原帖中添加了另一个问题。
    • 我希望我能再补充一点..您对第二个问题的解决方案也很完美..再次感谢您..
    【解决方案2】:

    你曾经使用的唯一原因是使用performselector:是当您知道要使用的选择器时选择的选择器,那么您应该使用它,所以performSelector:@Selector(alloc)绝对没有意义.

    【讨论】:

    • 谢谢 Psycho,我取出了 performSelector:@selector(alloc)。至少代码有效。现在我有了这个功能,我打算用我自己的方法重写。
    【解决方案3】:

    你应该使用普通的 objc 消息传递,而不是像 performSelector: 这样到处乱写。

    同样,您应该:

    • vc 设置为初始化程序的结果。
    • 无需在 ARC 程序中发送消息 release(或调用 [obj performSelector:@selector(release)];) - 编译器会为您处理。

    最后一个潜在的问题是初始化程序不应该使用这样的选择器。如果您确实需要该表单,请考虑使用/传递便利构造函数而不是初始化选择器。

    【讨论】:

    • @David DelMonte 我最终删除了那个位(关于破坏),因为它可能被解释为苛刻(我不知道是你还是第三方写的),而实际上它只是一面红旗。我也最喜欢 Fabian 的回答。干杯 =)
    • 我认为你是对的,贾斯汀,但谢谢.. 这是一个第三方应用程序,我将其插入我的应用程序以立即方便。我将测试我需要的功能并重写它。我感谢所有的答案..
    猜你喜欢
    • 1970-01-01
    • 2012-05-05
    • 2012-06-06
    • 1970-01-01
    • 2015-08-12
    • 1970-01-01
    • 1970-01-01
    • 2012-08-22
    • 1970-01-01
    相关资源
    最近更新 更多