将iOS5应用程序转换为ARC

时间:2011-11-06 18:46:49

标签: xcode ios5 automatic-ref-counting

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

我附加了一个屏幕截图,只显示两个错误。如果有人知道如何重新编写本节,我将非常感激。

enter image description here

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

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

这会出现此错误:

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

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

3 个答案:

答案 0 :(得分:2)

无论如何,你不应该使用-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如果它是保留值,您稍后使用CFRelease和__bridge_transfer进行处理,如果您想要将对象从CF转移到Objective-C,反之亦然。

答案 1 :(得分:1)

您应该使用普通的objc消息,而不是performSelector:这样的地方。

同样,你应该:

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

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

答案 2 :(得分:1)

你使用performSelector的唯一原因是:当动态生成选择器时,如果你知道要使用哪个选择器,那么你应该使用它,所以performSelector:@selector(alloc)绝对没有意义