【发布时间】:2010-03-10 20:28:45
【问题描述】:
我正在尝试在 Objective-c 中创建一个可调整大小的 CGPoints 数组。我已经研究过使用 NSMutableArray 但它似乎不允许调整大小。还有什么我可以用的吗?
谢谢
【问题讨论】:
标签: objective-c arrays vector resizable
我正在尝试在 Objective-c 中创建一个可调整大小的 CGPoints 数组。我已经研究过使用 NSMutableArray 但它似乎不允许调整大小。还有什么我可以用的吗?
谢谢
【问题讨论】:
标签: objective-c arrays vector resizable
使用NSMutableArray,但只需将CGPoint 结构体装箱到NSValue 对象中。示例:
CGPoint myPoint = {0,0};
CGPoint anotherPoint = {42, 69};
NSMutableArray * array = [NSMutableArray array];
[array addObject:[NSValue valueWithCGPoint:myPoint]];
[array addObject:[NSValue valueWithCGPoint:anotherPoint]];
CGPoint retrievedPoint = [[array objectAtIndex:0] CGPointValue];
请注意,+valueWithCGPoint: 和 CGPointValue 方法仅适用于 iPhone。但是,如果您在 Mac 上需要此功能,则有类似的方法可以处理 NSPoints,并且将 CGPoint 转换为 NSPoint 很简单(您可以强制转换或使用 NSPointFromCGPoint())。
【讨论】:
NSMutableArray 自动调整大小。
NSUInteger count = [array count];
NSMutableArray 用于对象。对于普通的旧数据类型,请使用 NSMutableData 和良好的旧指针类型转换。它是一个可调整大小的非结构化内存缓冲区,正是您需要的 POD 向量。至于静态类型安全,Objective C 并没有给你任何东西。
编辑:
创建一个初始大小为 n 个 CGPoint 结构的可变数据对象:
NSMutableData *Data = [NSMutableData dataWithLength: n*sizeof(CGPoint)];
将 CGPoint pt 放入缓冲区的第 i 个位置:
CGPoint pt;
NSRange r = {i*sizeof(CGPoint), sizeof(CGPoint)};
[Data replaceBytesInRange: r withBytes:&pt];
从第 i 个位置检索一个 CGPoint 到 pt:
CGPoint pt;
NSRange r = {i*sizeof(CGPoint), sizeof(CGPoint)};
[Data getBytes: &pt range:r];
将数组增加 n 个对象:
[Data increaseLengthBy:n*sizeof(CGPoint)];
希望涵盖它。请参阅 NSMutableData 参考,并记住所有 NSData 方法都适用于它。
【讨论】: