将C指针添加到NSMutableArray

时间:2012-04-13 05:07:22

标签: objective-c pointers nsmutablearray

我正在编写一个处理低级图像内存的Objective-C程序。我正在使用ANSI-C结构进行数据存储 - 由于我存储的数据是100%数据,没有任何方法可以对该数据进行操作,因此完全成熟的对象看起来有些过分。具体来说,我正在编写一个可定制的分色算法,它依赖于一系列颜色 - 这就是事情变得棘手的地方。我将我的颜色存储为三个浮点数的结构,以及一个整数标记(具体来说与分色算法有关)。 Everyhting进展顺利,除了一件事......

[实际问题]

我无法弄清楚如何添加指向NSMutableArray的指针!我知道如何添加一个对象,但添加指向结构的指针似乎更难 - 我不希望NSMutableArray解除引用我的指针并将结构视为某种奇怪的对象。我希望NSMutableArray将其自身的指针添加到其集合中。我该怎么做呢?

提前致谢,

4 个答案:

答案 0 :(得分:15)

有一个专门为此设计的课程:NSPointerArray。请参阅Apple的文档here。对于任意指针,您可能希望使用NSPointerFunctionsOpaqueMemoryNSPointerFunctionsOpaquePersonality选项。

如果NSPointerArray不可用(例如,如果您正在为iOS开发),那么您可以使用-[NSValue valueWithPointer:]包装指针,只要包装和开销的开销很大。展开不会太慢。

答案 1 :(得分:4)

您可以将指针包装在NSValue个对象中。

答案 2 :(得分:3)

示例:

int aa=99;
int *a=&aa;
char bb='a';
NSMutableArray *MS=[NSMutableArray new];
[MS addObject:[NSValue valueWithPointer:a]];
[MS addObject:[NSValue valueWithPointer:&bb]];
int *c=[[MS objectAtIndex:0] pointerValue];
char *d=[[MS objectAtIndex:1] pointerValue];

答案 3 :(得分:1)

如果NSMutableArray确实是你想要的,你可以使用这种方法:

NSMutableArray * NewNonRetainingArray() {
  CFAllocatorRef allocator = 0; /* << default */
  CFIndex capacity = 0; /* << no maximum */

  /*
    0 for the callbacks will result in elements which are not reference counted.
    you can write your own callbacks, if you like some extra diagnostics or
    special behavior. see the CFArrayCallBacks structure for a full description
    of all callbacks.
  */
  const CFArrayCallBacks* const callbacks = 0;
  return (NSMutableArray*)CFArrayCreateMutable(allocator, capacity, callbacks);
}

但是,您不希望将NSObject填入其中 - 它们不会被保留。

使用这种方法,你的CF / NS-Array的元素可能是指针或任何大小等于指针的原始值。