Objective c 使用自动引用计数问题获取指针隐式转换错误

Objective c 使用自动引用计数问题获取指针隐式转换错误,objective-c,ios,cocoa-touch,automatic-ref-counting,Objective C,Ios,Cocoa Touch,Automatic Ref Counting,我收到一个错误。ARC不允许将Objective-C指针隐式转换为“void” -(void)openAnimation { NSValue *contextPoint =[NSValue valueWithCGPoint:self.view.center]; [UIView beginAnimation:nil context:contextPoint]; // getting error here } 有人能帮我解决这个错误吗 谢谢首先,我要指出,使用基于块的动画方法

我收到一个错误。ARC不允许将Objective-C指针隐式转换为“void”

-(void)openAnimation {

     NSValue *contextPoint =[NSValue valueWithCGPoint:self.view.center];

    [UIView beginAnimation:nil context:contextPoint]; // getting error here
}
有人能帮我解决这个错误吗


谢谢

首先,我要指出,使用基于块的动画方法更容易实现这类功能。对于iOS4和iOS5

但要回答您的特定问题,上下文参数是一个void*。ARC不(不能)维护对void*指针的任何管理,因此当您将“contextPoint”(这是一个NSValue*)传递给此方法时,ARC实际上失去了对它的跟踪

编译器将允许使用桥接转换进行此操作。但您还必须确保您的“contextPoint”在该方法之外仍然存在,因此您需要的特定强制转换是保留的,即净保留计数为+1的强制转换:

[UIView beginAnimation:nil context:(__bridge_retained void *)contextPoint];
这就解决了眼前的问题,希望您现在将泄漏该contextPoint。因此,在您的
animationDidStart:context:
animationDidStop:finished:context:
(无论您打算在哪里使用此contextPoint)中,您需要将+1计数与以下内容相平衡:

NSValue *contextPoint = (__bridge_transfer NSValue *)context;
这会将该对象桥接回ARC的控制之下,并且_ubridge_传输会告诉ARC释放该对象以平衡先前保留的_ubridge_

同样,使用基于块的方法,让圆弧和块为您处理这些事情。他们已经知道如何正确捕获和保留动画或完成块中所需的对象


我希望这是有意义的。

因此,首先,我要指出,使用基于块的动画方法更容易做到这一点。对于iOS4和iOS5

但要回答您的特定问题,上下文参数是一个void*。ARC不(不能)维护对void*指针的任何管理,因此当您将“contextPoint”(这是一个NSValue*)传递给此方法时,ARC实际上失去了对它的跟踪

编译器将允许使用桥接转换进行此操作。但您还必须确保您的“contextPoint”在该方法之外仍然存在,因此您需要的特定强制转换是保留的,即净保留计数为+1的强制转换:

[UIView beginAnimation:nil context:(__bridge_retained void *)contextPoint];
这就解决了眼前的问题,希望您现在将泄漏该contextPoint。因此,在您的
animationDidStart:context:
animationDidStop:finished:context:
(无论您打算在哪里使用此contextPoint)中,您需要将+1计数与以下内容相平衡:

NSValue *contextPoint = (__bridge_transfer NSValue *)context;
这会将该对象桥接回ARC的控制之下,并且_ubridge_传输会告诉ARC释放该对象以平衡先前保留的_ubridge_

同样,使用基于块的方法,让圆弧和块为您处理这些事情。他们已经知道如何正确捕获和保留动画或完成块中所需的对象


我希望这是有意义的。

使用未声明的标识符\u bridge\u保留。看起来您缺少一个下划线。应该保留桥牌(桥牌前的两个底部)谢谢。我忘了一个下划线是我的错。谢谢:)使用了未声明的标识符_bridge _retained。看起来您缺少下划线。应该保留桥牌(桥牌前的两个底部)谢谢。我忘了一个下划线是我的错。谢谢:)