NSMutableArray的ADDOBJECT用malloc分配结构(NSMutableArray

2019-08-04 06:20发布

我在与一个代码片段麻烦。 我试图CLLocationCoordinate2D的一个实例添加到使用AddObject方法NSMutable数组,但每当执行行,我的应用程序崩溃。 有什么明显的错误与此代码?

飞机坠毁在这一行:

[points addObject:(id)new_coordinate];

Polygon.m:

#import "Polygon.h"

@implementation Polygon
@synthesize points;

- (id)init {
    self = [super init];
    if(self) {
        points = [[NSMutableArray alloc] init];
    }
    return self;
}


-(void)addPointLatitude:(double)latitude Longitude:(double)longitude {
    NSLog(@"Adding Coordinate: [%f, %f] %d", latitude, longitude, [points count]);
    CLLocationCoordinate2D* new_coordinate = malloc(sizeof(CLLocationCoordinate2D));
    new_coordinate->latitude = latitude;
    new_coordinate->longitude = longitude;
    [points addObject:(id)new_coordinate];
    NSLog(@"%d", [points count]);
}


-(bool)pointInPolygon:(CLLocationCoordinate2D*) p {
    return true;
}


-(CLLocationCoordinate2D*) getNEBounds {
    ...
}

-(CLLocationCoordinate2D*) getSWBounds {
    ...
}


-(void) dealloc {
    for(int count = 0; count < [points count]; count++) {
        free([points objectAtIndex:count]);
    }

    [points release];
    [super dealloc];
}

@end

Answer 1:

这样做的正确方法是一个封装内的数据NSValue ,这是专门为把C型在NSArray S和其他收藏品。



Answer 2:

只能添加NSObject的派生对象的数组。 您应该封装一个适当的对象(例如NSData的)里面的数据。

例如:

CLLocationCoordinate2D* new_coordinate = malloc(sizeof(CLLocationCoordinate2D));
    new_coordinate->latitude = latitude;
    new_coordinate->longitude = longitude;
    [points addObject:[NSData dataWithBytes:(void *)new_coordinate length:sizeof(CLLocationCoordinate2D)]];
    free(new_coordinate);

检索对象:

CLLocationCoordinate2D* c = (CLLocationCoordinate2D*) [[points objectAtIndex:0] bytes];


Answer 3:

您可以使用CFArrayCreateMutable功能与定制回调来创建一个可变数组不保留/释放。



文章来源: NSMutableArray addobject with malloc'd struct