从类方法中将指针分配/释放到数组

时间:2012-07-17 16:49:25

标签: objective-c ios arrays memory-management

我有一个自定义对象,我正在尝试编写一个返回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类的属性为CGPoint point

2 个答案:

答案 0 :(得分: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];
}

答案 1 :(得分:0)

如果您仅使用ObjC,则可以考虑使用包含MONCGPointArrayNSData实例的类(例如NSMutableData)。 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>等类型来表示这些集合。