Xcode 将iOS5应用程序转换为ARC
我正在将一些第三方代码集成到我的应用程序中,同时尝试将应用程序转换为ARC 我附加了一个屏幕截图来显示仅有的两个错误。如果有人知道如何重新编码这一部分,我将不胜感激 我还有一个问题要解决。解决这个问题最实际的方法是什么:Xcode 将iOS5应用程序转换为ARC,xcode,ios5,automatic-ref-counting,Xcode,Ios5,Automatic Ref Counting,我正在将一些第三方代码集成到我的应用程序中,同时尝试将应用程序转换为ARC 我附加了一个屏幕截图来显示仅有的两个错误。如果有人知道如何重新编码这一部分,我将不胜感激 我还有一个问题要解决。解决这个问题最实际的方法是什么: value = (NSString *)CFURLCreateStringByReplacingPercentEscapesUsingEncoding(kCFAllocatorDefault,
value = (NSString *)CFURLCreateStringByReplacingPercentEscapesUsingEncoding(kCFAllocatorDefault,
(CFStringRef)value,
CFSTR(" "),
kCFStringEncodingUTF8);
这会产生以下错误:
“将Objective-C指针类型'NSString*'转换为C指针类型'CFStringRef'(也称为'const struct\uu CFString*')需要桥接转换”
再次感谢。。我将尽快丢失此代码…您应该使用正常的objc消息传递,而不是像那样到处乱跑 此外,你应该:
- 将
设置为初始值设定项的结果vc
- 无需在ARC程序中发送消息
(或调用release
),编译器将为您处理该消息[obj performSelector:@selector(release)];
最后一个潜在问题是初始值设定项不应该使用这样的选择器。如果您真的需要这种形式,请考虑使用/传递便利构造函数而不是初始化选择器。< P>您应该使用普通Objc消息,而不是<代码> PrExpReloStult:<代码>。 此外,你应该:
- 将
设置为初始值设定项的结果vc
- 无需在ARC程序中发送消息
(或调用release
),编译器将为您处理该消息[obj performSelector:@selector(release)];
最后一个潜在问题是初始值设定项不应该使用这样的选择器。如果你真的需要这种形式,考虑使用/传递一个方便的构造函数而不是一个初始化选择器。你使用PyFraseStultor的唯一原因是:当选择器是动态生成的,如果你知道要使用哪一个选择器,那么你应该使用它,所以PrPrimeStult:@选择器(OLLC)完全没有意义。使用performSelector的唯一原因是:当动态生成选择器时,如果您知道要使用的选择器,那么您应该使用它,因此performSelector:@selector(alloc)绝对没有意义。无论如何都不应该使用
-performSelector:
。改用objc\u msgSend(目标、选择器等)
。
如果调用-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需要知道如何处理内存管理。您必须在演员阵容之前插入\uuuuuu桥
,\uuuu桥
或\uuuu桥
传输:
NSString *value;
value = (__bridge_transfer NSString *)CFURLCreateStringByReplacingPercentEscapesUsingEncoding(kCFAllocatorDefault, (__bridge CFStringRef)value, CFSTR(" "), kCFStringEncodingUTF8);
如果您只想在CF和Objective-C之间进行转换,请使用
\uu桥
,\uuuuu bridge\u retained
如果它是保留值,并且您稍后使用CFRelease和\uuuu bridge\u transfer处理它,如果您想将对象从CF传输到Objective-C,或者反之亦然。无论如何都不应该使用-performSelector:
。改用objc\u msgSend(目标、选择器等)
。
如果调用-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需要知道如何处理内存管理。您必须在演员阵容之前插入\uuuuuu桥
,\uuuu桥
或\uuuu桥
传输:
NSString *value;
value = (__bridge_transfer NSString *)CFURLCreateStringByReplacingPercentEscapesUsingEncoding(kCFAllocatorDefault, (__bridge CFStringRef)value, CFSTR(" "), kCFStringEncodingUTF8);
如果您只想在CF和Objective-C之间转换,则使用\uuuu bridge
,如果它是保留值,则使用\uuuu bridge\u retained
,如果您想将对象从CF传输到Objective-C或反之亦然,则稍后使用CFRelease和\uu bridge\u transfer
进行处理。谢谢Psycho,我拿出性能选择器:@selector(alloc)。至少代码是有效的。现在我有了这个功能,我计划用我自己的方法重写。多亏了Psycho,我拿出了performSelector:@selector(alloc)。至少代码是有效的。现在我有了这个功能,我计划用我自己的方法重写。@David DelMonte我最终删除了这个部分(关于销毁),因为它可能被解释为苛刻的(我不知道是你还是第三方写的),而实际上这只是一个危险信号。我也最喜欢费边的回答。我想你是对的,贾斯汀,但是谢谢。。这是一个第三方应用程序,我正在将其插入我的应用程序中,以便立即使用。我将测试我需要的功能并重写它。我感谢所有的答案。@David DelMonte我最终删除了这一点(关于销毁),因为它可能被解释为严厉(我不知道是你还是第三方写的),而实际上这只是一个危险信号。我也最喜欢费边的回答。我想你是对的,贾斯汀,但是谢谢。。这是一个第三方应用程序,我正在将其插入我的应用程序中,以便立即使用。我将测试我需要的功能并重写它。我感谢所有的答案。请注意,我在原来的帖子中又增加了一个问题。我希望我能再补充一点。。你对第二个问题的解决方案也很完美。。再次感谢..请注意,我在原来的帖子中添加了另一个问题.我希望我能再添加一点。。你对第二个问题的解决方案也很完美。。再次感谢你。。