【问题标题】:What can be passed in (void *)context?在 (void *) 上下文中可以传递什么?
【发布时间】:2010-10-19 10:23:02
【问题描述】:

我正在使用一些 UIView 动画的东西

[UIView beginAnimations:nil context:nil];
// ... Animation configuration ...
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(animationEnded:finished:context:)];
[UIView commitAnimations];

关于以下问题:Apple rejected app because of animationDidStop:finished:context: is a non-public api

我将自己的方法实现为“setAnimationDidStopSelector”。

我的问题是关于 context:(void *)context 参数。苹果将​​其定义如下:

其他应用程序提供 传递给 动画委托消息—— 选择器设置使用 setAnimationWillStartSelector:和 setAnimationDidStopSelector:方法。

我想知道什么东西之王可以作为上下文传递。我对 Objective-C 和 C 编程比较陌生,对 void* 类型有点迷茫。

我们可以传入任何类型的参数、对象、NSDictionnary、NSString 等吗?

谢谢

【问题讨论】:

    标签: iphone ios uiviewanimation


    【解决方案1】:

    void * 是指向任何东西的指针。您可以将指针传递给任何对象或其他东西,例如结构或 Core Foundation 不透明类型。要摆脱编译器警告,请将指针转换为void *

    ... context:(void *)myDictionary];
    

    请注意,该方法不知道context 包含什么,因此不会保留它或以其他方式关心正确的内存管理。您必须确保在调用动画委托方法时传递给context 的东西仍然存在。

    【讨论】:

    【解决方案2】:
    context:(void *)myDictionary];
    

    当调用该方法并试图通过时

    (void *)[NSNumber numberWithInt:5] - 
    

    xCode 建议制作一些 _bridge,因为从 C 到 Objective-C 的指针转换无效 ...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-15
      • 2016-12-17
      • 2014-05-25
      • 1970-01-01
      相关资源
      最近更新 更多