我最近发现了这些类,如NSMapTable和NSPointerArray,它们的工作方式类似于传统的集合,但也允许存储弱引用或普通的旧C指针。不幸的是,您似乎无法使用for...in语法来迭代非NSObject指针。例如:
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 *')不是有效的对象
我需要这么做吗?
for (int i=0, len=segments.count; i<len; i++) {
Segment *seg = [segments pointerAtIndex:i];
...这不是世界末日,但我只想确定。
发布于 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)。
下面是一个简单的示例,它将如何工作:
__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);
}因此,这无助于简化代码,您可能希望继续使用显式循环。
但是对于大型数组,它可能会提高性能,因为指针是从数组中以批形式“获取”的,而不是单独的每个指针。
发布于 2014-03-24 00:25:21
为了(..)在这种情况下,语法无法工作,因为分段是一个结构,而不是一个目标C对象。您的第二个for循环应该可以工作。
https://stackoverflow.com/questions/22598900
复制相似问题