问题是这GLKVector3
是 C 风格struct
,而不是对象。所以它不知道如何响应retain
or 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];