我正在将一些第三方代码集成到我的应用中,同时尝试将应用转换为ARC。
我附加了一个屏幕截图,只显示两个错误。如果有人知道如何重新编写本节,我将非常感激。
我还有一个皮塔要解决。解决这个问题最实用的方法是什么:
value = (NSString *)CFURLCreateStringByReplacingPercentEscapesUsingEncoding(kCFAllocatorDefault,
(CFStringRef)value,
CFSTR(" "),
kCFStringEncodingUTF8);
这会出现此错误:
“将Objective-C指针类型'NSString *'转换为C指针类型'CFStringRef'(又名'const struct __CFString *')需要桥接转换”
再次感谢..我将尽快丢失此代码......
答案 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
设置为初始化程序的结果。release
(或调用[obj performSelector:@selector(release)];
) - 编译器会为您处理。最后一个基本问题是初始值设定项不应该使用这样的选择器。如果您确实需要该表单,请考虑使用/传递一个便利构造函数而不是初始化选择器。
答案 2 :(得分:1)
你使用performSelector的唯一原因是:当动态生成选择器时,如果你知道要使用哪个选择器,那么你应该使用它,所以performSelector:@selector(alloc)绝对没有意义