这段代码在非 ARC 下可以正常编译:
int *privateObjMemory = (int *)[myObject performSelector:@selector(privateMethod)];
现在我在 ARC 中,我得到:
Cast of an Objective-C pointer to 'int *' is disallowed with ARC
我该如何解决这个问题? :)
最佳答案
写成:
int* privateObjMemory = [myObject privateMethod];
;)
您想要避免这种情况的原因是它对于 ARC 来说是不明确的。 performSelector:
返回一个对象——是否应该保留 int*
?嗯...不。
更新
基于评论,并删除以前的文字:
但这不是一个很好的解决方案。如果您正在调用特定的私有(private) API,那么您必须知道其签名(例如参数和返回类型)。如果它是您的私有(private)API,那么找出一种方法使该私有(private)接口(interface)有选择地可见。
如果是别人的私有(private)API,则在该类型上声明一个类别,该类别具有正确的参数和返回类型。
然后正确声明选择器,编译器将能够通过直接向对象发送消息来正确设置调用 - 无需使用 performSelector:
。
关于objective-c - ARCcast - 破解 objc 对象内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13470621/