0

我有一个自定义对象,我试图在其中编写一个返回CGPoint结构数组的便利类方法。这样做的原因是有几种方法,例如将CGPathAddLines其作为参数,而类方法可以让我免于CGPoint每次将自定义对象转换为结构数组。不幸的是,我不确定实现这一目标的最佳方法,尤其是在内存管理方面。

到目前为止,这是我的实现:

+ (CGPoint*)CGPointsFromData:(NSArray*)data
{
    CGPoint *points = (CGPoint*)malloc(data.count * sizeof(CGPoint));
    DataPoint *dataPoint;
    int i = 0;
    for (id object in data) {
        if ([object isKindOfClass:[DataPoint class]]) {
            dataPoint = (DataPoint*)object;
            points[i] = dataPoint.point;
            i++;
        }
    }
    return points;
}

编辑:如果不清楚,DataPoint该类有一个 property CGPoint point

4

2 回答 2

1

如果您希望这是一个类方法,请将“alloc”或类似的词放在方法名称中,并将释放内存的义务放在方法的调用者身上,然后只需返回您分配的指针(不需要在此方法中涉及来自任何其他范围的变量)。然后,调用此方法的任何人都可以将指针存储在实例变量中,并在适当的时候释放它。

+ (CGPoint*)allocCGPointsArrayWithData:(NSArray*)data
{
    CGPoint *thesePoints = (CGPoint*)malloc(data.count * sizeof(CGFloat));
    DataPoint *dataPoint;
    int i = 0;
    for (id object in data) {
        if ([object isKindOfClass:[DataPoint class]]) {
            dataPoint = (DataPoint*)object;
            thesePoints[i] = dataPoint.point;
            i++;
        }
    }
    return thesePoints;
}    

然后消费这个(在这种情况下来自同一个班级)

// @interface
@interface FooViewController:UIViewController {
    CGPoint *_myPointsCArray;
}

// @implementation    
-(void) viewWillAppear {
    _myPointsCArray = [[self class] allocCGPointsArrayWithData:self.dataArray];
    [super viewWillAppear];
}
-(void) viewWillDisappear {
    free(_myPointsCArray);
    [super viewWillDisappear];
}
于 2012-07-17T17:01:40.513 回答
0

如果您只使用 ObjC,您可能会考虑一个MONCGPointArray包含 a NSDataorNSMutableData实例的类(例如 )。将NSData负责分配和重新分配,并且类接口可用于引入类型安全。

为了显示:

@interface MONCGPointArray : NSObject
{
@private
    NSMutableData * cgPoints;
}

- (NSUInteger)count;
- (CGPoint)CGPointAtIndex:(NSUInteger)idx;
- (const CGPoint*)CGPoints;

- (void)appendCGPoint:(CGPoint)point;

// ...

@end

就个人而言,我只是使用诸如 C++ 之类的类型std::vector<CGPoint>来处理此类集合。

于 2012-07-17T17:22:18.787 回答