将C指针添加到NSMutableArray

8
我正在编写一款处理低级图像内存的Objective-C程序。我使用ANSI-C结构体来存储数据,因为完整的对象似乎过于复杂,而我要存储的数据是100%的数据,没有操作这些数据的方法。具体来说,我正在编写一个可定制的色调分离算法,该算法依赖于一组颜色--这就是问题所在。我将我的颜色存储为三个浮点数和一个整数标志的结构体。除了一个问题外,一切都进行得很顺利...
[实际问题]
我不知道如何向NSMutableArray添加指针!我知道如何添加对象,但是添加指向结构体的指针似乎更加困难--我不希望NSMutableArray解引用我的指针并将结构体视为某种奇怪的对象。我希望NSMutableArray自己将指针添加到其集合中。我该怎么做?
提前感谢,
G
4个回答

16
有一个专门设计用于此的类:NSPointerArray。请参阅苹果的文档这里。对于任意指针,您可能会想使用NSPointerFunctionsOpaqueMemoryNSPointerFunctionsOpaquePersonality选项。
如果NSPointerArray不可用(例如,如果您正在为iOS开发),则可以使用-[NSValue valueWithPointer:]包装指针,只要包装和取消包装的开销不会太慢。

哦我的!我从来没有想过!我会去看一下,谢谢 :) - Georges Oates Larsen
2
Cocoa有很多集合类,大多数人都会错过--我发现NSMapTable特别有用。在这里查看完整列表:https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Collections/Collections.html - andyvn22
哦!谢谢!我得花些时间深入研究一下--还有一件事,我遇到了一些问题,无法让编译器将NSPointerArray识别为一种类型--你知道我需要导入哪个头文件才能被识别吗? - Georges Oates Larsen
这是Cocoa的一部分 - 也许你正在iOS上使用Cocoa Touch进行开发?如果是这种情况,不幸的是,NSPointerArray不可用,除非包装和解包开销过慢,否则您应该考虑Carl的解决方案。抱歉! :) - andyvn22
哦,亲爱的,那就是它了。小细节!我很抱歉没有在一开始就说出来。无论如何,非常感谢您提供的大量详细信息。我只希望我能接受你和卡尔·诺鲁姆的答案...我会接受你的答案,因为它更详细,并且你回来帮助我解决了任何问题 :) - Georges Oates Larsen

4
您可以使用 NSValue 对象来封装指针。

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];

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元素可以是指针或任何大小等于指针的原始值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接