【问题标题】:Create a re-sizable array of CGPoints in objective-c在objective-c中创建一个可调整大小的CGPoints数组
【发布时间】:2010-03-10 20:28:45
【问题描述】:

我正在尝试在 Objective-c 中创建一个可调整大小的 CGPoints 数组。我已经研究过使用 NSMutableArray 但它似乎不允许调整大小。还有什么我可以用的吗?

谢谢

【问题讨论】:

    标签: objective-c arrays vector resizable


    【解决方案1】:

    使用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())。

    【讨论】:

    • 嗨,您不必为数组分配大小吗?如果需要,addObject 还会调整数​​组的大小吗?
    • @jesse.rj - NSMutableArray 自动调整大小。
    • @jesse.rj:事实上,您在创建 NSMutableArray 时指定的容量本质上只是一个提示,它可以用来决定最佳内部行为。它仍然会从 0 个对象开始,然后调整大小以容纳尽可能多的对象。
    • 嗨,还有一个问题,在我向数组添加了几个点之后,如何检查数组的大小?
    • @jesse.rj NSUInteger count = [array count];
    【解决方案2】:

    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 方法都适用于它。

    【讨论】:

    • 它不是 Objective C 意义上的对象。它是一个包含两个整数的结构。 CGPoint、CGSize、CGRect - 所有结构。与 C++ 不同,在 ObjC 中,结构与类有很大不同。
    • 谢谢!您是否碰巧有一个如何使用 NSMutabledata 示例的链接?
    • +1 感谢您的回答!我要先尝试 nsmutablearray,因为它看起来更容易,如果我不让它工作不正常,请使用 NSMutableData
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-03
    • 1970-01-01
    • 2011-11-07
    • 1970-01-01
    • 2019-10-10
    相关资源
    最近更新 更多