0

我正在尝试采用 C 风格的向量并将其转换为 NSMutable 数组对象。

这是功能:

+(NSMutableArray*)arrayFromPoints:(vector<Point2f>&)points
{
    NSMutableArray* pointArray = [[NSMutableArray alloc] init];
    for (int i=0;i<points.size();i++)
    {
        Point2f point = points[i];
        JBPoint* point2 = [[JBPoint alloc]initWithX:point.x andY:point.y];
        [pointArray addObject:point2];
    }
    return pointArray;
}

自定义点类:

 @implementation JBPoint

float _x;
float _y;

-(id) initWithX:(float)x andY:(float)y
{
    if (self=[super init])
    {
       _x = x;
       _y=y;
    }
    return self;
}

-(float)x{ return _x;}
-(float)y {return _y;}

@end

测试输出:

for (JBPoint* pnt in array)
{
    NSLog(@"%f, %f", pnt.x, pnt.y);
}

我除了它来输出数组,但每次它只给我最后一个值!有谁知道为什么?

我认为它们可能指向同一个对象,但它们具有不同的内存地址。

4

2 回答 2

0

所以我发现了问题所在。float _x; float _y;在哪里被视为类变量而不是实例变量。将课程更改为:

@interface JBPoint()
{
    float _x;
    float _y;
}

@end

@implementation JBPoint

-(id) initWithX:(float)x andY:(float)y
{
    if (self=[super init])
    {
       _x = x;
       _y=y;
    }
    return self;
}

-(float)x{ return _x;}
-(float)y {return _y;}

@end
于 2012-12-02T20:20:49.480 回答
0

如果你写

@property (nonatomic, readonly) float x;
@property (nonatomic, readonly) float y;

在您的头文件中,您不需要声明实例变量(并且可以避免这里的问题),并且您可以删除您编写的 getter 方法,因为它们都将由编译器为您生成,并且您的自定义 init 方法将继续工作(使用最新的编译器)。

这样做是个好主意,因为:

  • 更少的代码
  • 您的意图很明确 - 2 个对客户端只读的变量
  • 遵循语言约定

如果您使用的是旧编译器(旧版本的 Xcode),那么您还必须使用@synthesize如下访问器:

@synthesize x = _x;

一些有趣的旁白:

使用最新的编译器,您不需要类扩展。

@implementation{
    float _x;
    float _y;
}

也会奏效的。

如 WWDC 2012 session video 413 中所引用的,当前推荐的编写 init 方法的模式是:

...
self = [super init];
if (self) {
...
}
return self;
于 2012-12-02T23:07:53.107 回答