2012-07-17 68 views
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

+1

您正在使用'_points'和'points',就好像它們是實例的'@ property's一樣,但您處於類方法中。你可以顯示'_points'(和'points'爲這個問題)在哪裏被聲明/初始化? – 2012-07-17 16:52:48

+0

對不起,我糾正了它。我一直在亂搞我的代碼一段時間,所以我忘了改回一些東西。 – OpticalDelusion 2012-07-17 16:54:24

回答

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; 
}  

,然後如果你使用ObjC只,你可能會考慮,而不是一類(如MONCGPointArray),它持有NSData(在這種情況下,同一類)消費這個

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

// @implementation  
-(void) viewWillAppear { 
    _myPointsCArray = [[self class] allocCGPointsArrayWithData:self.dataArray]; 
    [super viewWillAppear]; 
} 
-(void) viewWillDisappear { 
    free(_myPointsCArray); 
    [super viewWillDisappear]; 
} 
+0

這是我正在尋找的內容,但我有一些後續問題。我用這個方法不是在'UIViewController'中,而是在'UIView'中,據我所知,它沒有像'viewDidUnload'這樣的內置解除分配方法。所以我不知道我會在'UIView'中釋放內存。也許在類方法中設置autorelease?那是我在找什麼? – OpticalDelusion 2012-07-17 17:53:25

+1

傳統上,這是你實現' - (void)dealloc'。然而,如果這是一個共享的數據結構,可能值得考慮*而不是*擁有一個UIView「擁有」它,而只是有一個「弱」指針指向它(即它有一個指向它...沒什麼特別的),但該視圖的ViewController實際上「擁有」它並可以適當地釋放(因此也更好地使VC能夠在視圖之間共享數據)。 – 2012-07-17 18:03:28

0

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>這種集合。

+0

改變我的對象結構來合併這在我的情況下不是一個真正的選擇。而類方法本身需要返回一個'CGPoint'結構數組。 – OpticalDelusion 2012-07-17 17:49:17