使用C ++ - Objective-C-blocks中的对象

时间:2014-01-24 00:13:57

标签: ios performance objective-c-blocks objective-c++

我有一个C ++ - 对象obj,我想在一个块中访问它:

MyCppClass obj;
void(^myBlock)() = ^{
    obj.test();
};

这里的问题是obj被复制到块中,但我想使用对原始对象的引用。我可以改用指针:

MyCppClass obj;
MyCppClass *objP = &obj;
void(^myBlock)() = ^{
    objP->test();
};

但我认为取消引用指针比使用引用需要更多时间。 (性能至关重要,因为在我的项目中,为大图像的每个像素调用这样的块。)

如何访问块内的对象?

1 个答案:

答案 0 :(得分:0)

取消引用指针比函数调用或C ++方法调用更快,它涉及几个指针解引用以查找类中的方法,然后实际的函数调用(实际上在堆栈上分配内存)可以省去一些注册到RAM,然后返回时反向。所以不要担心这里的表现。如果探查器向您显示单个指针取消引用会导致性能问题,那么您遇到了更大的问题,您可能应该使用手工制作的汇编程序,而忘记使用C ++类或块。此外,这是一件非常罕见的事情。

使用指针或C ++引用(后者在引擎盖下是相同的,但是用它来拍摄自己很难,并且代码保持更可读)。请记住,如果您要在与当前函数相同的函数(或由函数调用的函数)中使用块,这只是一个解决方案。

因为C ++对象在堆栈上,所以它会消失,所以如果您将块复制并复制它并稍后调用它,那么指针将无效。在最好的情况下,你会崩溃。在最坏的情况下,用于该对象的RAM芯片上的点已经被用于其他东西,并且你将覆盖其他一些内存,并导致看似无关的崩溃。

所以,如果你想保持块,你将不得不做'objP = new MyCppClass'来创建对象,然后做'删除objP'(也许在最后一次调用块时,如果你可以检测到并且之后不需要对象来摆脱它。