【问题标题】:Converting an NSValue back to the struct type that was stored in it?将 NSValue 转换回存储在其中的结构类型?
【发布时间】:2013-02-04 11:34:48
【问题描述】:

我通过NSValue 对象和以下代码行将Chipmunk Physics 的cpShape 对象存储在NSMutableDictionary 中:

NSValue *shapeValue = [[NSValue alloc] initWithBytes: shape objCType: @encode(cpShape)];
[staticBodiesInUse setObject: shapeValue forKey: name];

我现在需要将cpShape 取出,以便将其与另一个形状进行比较。我怎样才能做到这一点?我在NSValue 中看到了一个getValue: 方法,但它需要一个缓冲区,不太清楚如何处理它。

【问题讨论】:

    标签: ios objective-c cocoa-touch chipmunk nsvalue


    【解决方案1】:

    所以 trojanfoe 的回答只是部分正确。

    这样做有一个巨大的问题。当您以这种方式创建NSValue 时,您正在复制cpShape 结构,然后将其取回,您将再次复制它。 cpShape 结构几乎完全被引用使用。每次复制它时,您都会获得对新副本的新引用,并且其中一些副本存在于堆栈中并被无声地自动销毁。非常非常糟糕。

    相反,您想使用[NSValue valueWithPointer:shape] 创建一个NSValue,并使用[value pointerValue] 取回该指针。这样 NSValue 只存储一个指向原始 cpShape 的指针。

    【讨论】:

    • 使用cpShape * 是否没有问题?我不这么认为,除非非常小心地使用,否则会导致潜在的错误。
    • @slembcke 您能否详细说明为什么在当前堆栈帧中创建结构的副本是不好的(或者比传递指向结构的指针更糟糕)?还是因为花栗鼠的运作方式?
    【解决方案2】:

    是不是很简单:

    NSValue *value = [staticBodiesInUse objectForKey:name];
    cpShape shape;
    [value getValue:&shape];
    

    【讨论】:

    • 看起来是这样,是的。很明显,我错过了参考课程;)
    猜你喜欢
    • 2021-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多