1

我正在尝试将 GLKVector3 对象添加到 NSMutableArray 中。我知道 NSMutableArrays 只会接受某些对象,所以对我来说最好的方法是将 GLKVector3 添加到数组中。

这是一个代码示例:

        for(id basenormal in [jsnmvtx objectForKey:@"baseNormals"]){
            [basenormalsVectorArrays addObject:GLKVector3MakeWithArray(basenormal)];
        }

谢谢

4

1 回答 1

3

问题是这GLKVector3是 C 风格struct,而不是对象。所以它不知道如何响应retainor release,因此不能与NSArray.

您可以做的是将每个都包装成NSValue一个对象类型,并且它知道如何在其中保留任意 C 类型。它不是特别整洁,因为您跨越了 C 和 Objective-C 之间的边界,但是例如

GLKVector3 someVector;

[array addObject:[NSValue valueWithBytes:&someVector objCType:@encode(GLKVector3)]];

...

GLKVector3 storedVector;

NSValue *value = ... something fetched from array ...;
[value getValue:&storedVector];

// storedVector now has the value of someVector

这会将 的内容复制someVector到 中NSValue,然后将它们再次复制到storedVector.

您可以使用valueWithPointer:并且pointerValue如果您希望someVector在数组中保留对的引用而不是复制内容,那么您需要小心手动内存管理,因此更好的解决方案可能是使用NSData如下:

// we'll need the vector to be on the heap, not the stack
GLKVector3 *someVector = (GLKVector3 *)malloc(sizeof(GLKVector3));

[array addObject:[NSData dataWithBytesNoCopy:someVector length:sizeof(GLKVector3) freeWhenDone:YES]];
// now the NSData object is responsible for freeing the vector whenever it ceases
// to exist; you needn't do any further manual management

...

GLKVector3 *storedVector = (GLKVector3 *)[value bytes];
于 2013-02-22T20:36:53.753 回答