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 セッション ビデオ 413 で参照されているように、現在推奨されている init メソッドの記述パターンは次のとおりです。

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