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クラスにはプロパティがあります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を保持するクラス (例: ) を検討することもできます。が割り当てと再割り当てを処理し、クラス インターフェイスを使用してタイプ セーフを導入できます。NSDataNSMutableDataNSData

説明する:

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

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

- (void)appendCGPoint:(CGPoint)point;

// ...

@end

std::vector<CGPoint>個人的には、そのようなコレクションには C++ などの型を使用するだけです。

于 2012-07-17T17:22:18.787 に答える