ARC cast - Hacking objc对象内存

时间:2012-11-20 09:56:23

标签: objective-c automatic-ref-counting

这段代码用于在非ARC中编译好:

int *privateObjMemory = (int *)[myObject performSelector:@selector(privateMethod)];

现在我在ARC我得到了:

  

使用ARC

禁止使用指向'int *'的Objective-C指针

我该如何解决这个问题? :)

5 个答案:

答案 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编译器标志。

enter image description here

答案 2 :(得分:0)

我认为这与ARC无关。 ARC只会导致警告或错误。 AFAIK(我不会在血液中签名)使用performSelector调用的方法的返回值是nil或id。因此它必须是一个不是标量的对象。它可能适用于int *,因为id是对(但是对象,而不是标量)的引用。要保存,您应该更改代码并返回NSNubmer对象。

答案 3 :(得分:0)

使用id作为对象的类型。

答案 4 :(得分:0)

在ARC documentation中,他们具体说..

  

id和void *之间没有偶然的演员。

performSelector返回id,无法使用非客观C对象引用进行转换。

在我链接的文档中,向下滚动并阅读“管理免费电话桥接”部分。