2

我的地图对象有一组坐标。它并不总是具有相同数量的坐标。在java中,我只是将对象声明为Double[] xpoints并在实例化这样的地图时设置它的大小xpoints = new double[npoints]

我怎么能用objective-c做到这一点?

我试过这样做:@property(nonatomic) double * xpoints;但是当我用 NSLog 打印它时,它的所有值都变成了 0。

地图的初始化:

-(id)initWithXpoints:(double[]) xpointss Ypoints:(double[]) ypointss Npoints:(int)npointss
{
    self = [super init];
    if (self)
    {
        self.xpoints = xpointss;
        self.ypoints = ypointss;
        self.npoints = npointss;
    }
    return self;
}

不过有些奇怪的事情发生了。当我从创建地图的对象打印 xpoints[0] 时,这些值变为零。我第一次打印它就可以了。第二次它只打印零。

我认为这是因为发送到 init 的 xpointss 已从内存中删除。如果它是一个指针,我如何“实例化” xpoints 属性?

有一个更好的方法吗?

补充说:我尝试像这样创建一个临时xpoints:

double tempxpoints[npointss];
double tempypoints[npointss];
for (int i = 0; i < npointss; i++)
{
    tempxpoints[i] = xpointss[i];
    tempypoints[i] = ypointss[i];
}
self.xpoints = tempxpoints;
self.ypoints = tempypoints;

但它仍然没有工作。

编辑:感谢所有答案。这最终成为我的最终初始化代码:

-(id)initWithXpoints:(double[]) xpointss Ypoints:(double[]) ypointss Npoints:(int)npointss
{
    self = [super init];
    if (self)
    {
         _xpoints = [[NSMutableArray alloc] init];
         _ypoints = [[NSMutableArray alloc] init];
         for (int i = 0; i < npointss; i++)
         {
             NSNumber *tempx = [NSNumber numberWithDouble:xpointss[i]];
             NSNumber *tempy = [NSNumber numberWithDouble:ypointss[i]];
             [_xpoints addObject:tempx];
             [_ypoints addObject:tempy];
         }
         _npoints = npointss;
    }
    return self;
}
4

2 回答 2

7

如果您将数组分配为局部变量,那么它们将被分配到堆栈上。当执行离开函数时,这些内存区域被释放。您必须使用malloc()来分配可以传递并用于free()释放它们的数组。

// to allocate
double[] tempxpoints = (double[])malloc(sizeof(double) * npointss);

// to free when not used any more
free(tempxpoints);

但实际上NSArray已经设计用于处理这些情况。使用 ARC,您甚至不必关心释放内存。

NSMutableArray *tempxpoints = [[NSMutableArray alloc] init];
[tempxpoints addObject:@2]; // wrap the double in an NSNumber object
于 2013-08-21T18:54:22.620 回答
3

如果你对它完全是 Objective-C,你会使用 an NSArray,用 s 填充它NSNumber并且从不指定长度。您通常可以提示他们可能需要多少空间,但 Objective-C 的集合总是动态调整大小。

在编译器的最新版本中,您可以使用array[x]符号 onNSArray并编写直接NSNumber常量,就@4.5f好像这完全可以使交易变得更甜蜜一样。

如果你真的想要 C 风格的数组,那么你需要下降到 C 的思想水平。所以,像:

@property(nonatomic, readonly) double * xpoints;

和:

-(id)initWithXpoints:(double[]) xpointss Ypoints:(double[]) ypointss Npoints:(int)npointss
{
    self = [super init];
    if (self){
        size_t sizeOfArraysInBytes = sizeof(double)*npointss;
        _xpoints = (double *)malloc(sizeOfArraysInBytes);
        memcpy(_xpoints, xpointss, sizeOfArraysInBytes);
        /* ... etc ... */

        /* you never use self. notation in an init because it's a method call,
        and method calls on objects that are not yet fully instantiated aren't
        safe. Sample cause of failure: a subclass overrides the setter */
    }
    return self;
}

- (void)dealloc
{
    free(_xpoints);
    /* ... etc ... */
}

数组本身将在其他地方读/写(它是只读的指针,而不是它指向的东西)class.xpoints[0],等等。

于 2013-08-21T18:54:37.270 回答