我有一个自定义对象,我正在尝试编写一个返回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
。
答案 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,则可以考虑使用包含MONCGPointArray
或NSData
实例的类(例如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>
等类型来表示这些集合。