这段代码用于在非ARC中编译好:
int *privateObjMemory = (int *)[myObject performSelector:@selector(privateMethod)];
现在我在ARC我得到了:
使用ARC
禁止使用指向'int *'的Objective-C指针
我该如何解决这个问题? :)
答案 0 :(得分:3)
将其写为:
int* privateObjMemory = [myObject privateMethod];
)
你想避免这种情况的原因是它对ARC不明确。 performSelector:
会返回一个对象 - 是否应保留int*
?嗯...没有。
<强>更新强>
根据评论并删除以前的写作:
但这不是一个很好的解决方案。如果要调用特定的私有API,则必须知道其签名(例如参数和返回类型)。如果它是您的私有API,那么找出一种方法可以选择性地显示该私有界面。
如果是其他人的私有API,则在类型上声明一个具有正确参数和返回类型的类别。
然后正确地声明了选择器,并且编译器将能够通过直接向对象发送消息来正确设置调用 - 而无需使用performSelector:
。
答案 1 :(得分:2)
不要将Obj-C指针强制转换为int *
,如果使用ARC,则无法解决此问题。
之所以这样,是因为在运行时将ponter转换为int*
意味着无法跟踪指针所指向的对象的内存。因此,在不使用ARC时允许(因为您可以自己管理内存),但在ARC处于活动状态时则不允许。
如果必须执行此操作,则可以对正在使用的文件禁用ARC。在项目设置中使用实现文件上的-fno-objc-arc
编译器标志。
答案 2 :(得分:0)
我认为这与ARC无关。 ARC只会导致警告或错误。 AFAIK(我不会在血液中签名)使用performSelector调用的方法的返回值是nil或id。因此它必须是一个不是标量的对象。它可能适用于int *,因为id是对(但是对象,而不是标量)的引用。要保存,您应该更改代码并返回NSNubmer对象。
答案 3 :(得分:0)
使用id
作为对象的类型。
答案 4 :(得分:0)
在ARC documentation中,他们具体说..
id和void *之间没有偶然的演员。
performSelector
返回id
,无法使用非客观C对象引用进行转换。
在我链接的文档中,向下滚动并阅读“管理免费电话桥接”部分。