首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用NSPointerArray,如何迭代不透明指针?

使用NSPointerArray,如何迭代不透明指针?
EN

Stack Overflow用户
提问于 2014-03-24 00:07:04
回答 2查看 3.3K关注 0票数 4

我最近发现了这些类,如NSMapTableNSPointerArray,它们的工作方式类似于传统的集合,但也允许存储弱引用或普通的旧C指针。不幸的是,您似乎无法使用for...in语法来迭代非NSObject指针。例如:

代码语言:javascript
复制
typedef struct Segment {
    CGPoint bottom, top;
} Segment;
...
NSPointerArray *segments = [[NSPointerArray alloc] 
                                 initWithOptions:NSPointerFunctionsOpaqueMemory];
...
Segment *s = malloc(sizeof(Segment));
[segments addPointer: s];
...
for (Segment *s in segments) {   // nope...

编译器不喜欢最后一行。错误:

选择器元素类型'Segment *‘(又名'struct Segment *')不是有效的对象

我需要这么做吗?

代码语言:javascript
复制
for (int i=0, len=segments.count; i<len; i++) {
    Segment *seg = [segments pointerAtIndex:i];
    ...

这不是世界末日,但我只想确定。

EN

回答 2

Stack Overflow用户

发布于 2014-03-24 01:04:31

(这可能更有理论意义。) NSPointerArray确实符合NSFastEnumeration协议,只有for (id object in collection)语言结构才不能与非目标C指针的任意指针一起使用。

但是,您可以通过直接调用NSFastEnumeration方法countByEnumeratingWithState:objects:count:从数组中获取大量指针。这有点棘手,因为该方法不需要填充所提供的缓冲区(如这里所解释的:How for in loop works internally - Objective C - Foundation)。

下面是一个简单的示例,它将如何工作:

代码语言:javascript
复制
__unsafe_unretained id objs[10];
NSUInteger count = [segments countByEnumeratingWithState:&state
                                                 objects:objs count:10];

// Now state.itemsPtr points to an array of pointers:
for (NSUInteger i = 0; i < count; i++) {
    Segment *s = (__bridge Segment *)state.itemsPtr[i];
    NSLog(@"%p", s);
}

因此,这无助于简化代码,您可能希望继续使用显式循环。

但是对于大型数组,它可能会提高性能,因为指针是从数组中以批形式“获取”的,而不是单独的每个指针。

票数 4
EN

Stack Overflow用户

发布于 2014-03-24 00:25:21

为了(..)在这种情况下,语法无法工作,因为分段是一个结构,而不是一个目标C对象。您的第二个for循环应该可以工作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22598900

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档