iOS / Objective-C: NSInteger теряется при простом создании объекта Coordinates2D - PullRequest
0 голосов
/ 17 апреля 2011

Я вырываю голову из-за этого .. Я не знаю, что происходит не так.

Я создал очень простой класс Coordinates2D для хранения двух значений NSInteger, а также строкового представления.для использования с NSLog.Я запускаю этот код в симуляторе iOS 4.3 для iPad в комплекте с последней версией xCode.

По некоторым причинам целочисленные значения, передаваемые конструктору initX: Y: теряются.Приведенный ниже код предоставляет Coordinates2D и некоторый код для печати произвольного значения с плавающей точкой в ​​исходной форме, приведенного к типу int, приведенного к типу NSInteger, а затем внутри объекта Coordinates2D.

Вы должны увидеть, как я,что значение теряется внутри конструктора Coordinates2D;аргумент'ordins.x 'в NSLog выводится как случайное большое целое число, указывающее, что его значение потеряно в памяти.

Может кто-нибудь помочь мне понять, почему это происходит?Я не вижу, что я делаю неправильно.

Большое спасибо!

Coordinates2D.h

#import <Foundation/Foundation.h>
@interface Coordinates2D : NSObject {
    NSInteger x,y;
    NSString *asString;
}
@property (nonatomic) NSInteger x,y;
@property (nonatomic, retain) NSString *asString;
-(void)updateStringRepresentation;
-(id)initX:(NSInteger)x Y:(NSInteger)y;
@end

Coordinates2D.m

#import "Coordinates2D.h"
@implementation Coordinates2D
@synthesize x,y,asString;

-(id)initX:(NSInteger)x_ Y:(NSInteger)y_ {
    NSLog(@"coords: %i, %i",x_,y_);
    if ((self = [super init])) {
        self.x = x_;
        self.y = y_;
        NSLog(@"Coordinates stored %i as %i",x_,self.x);
        [self updateStringRepresentation];
    }
    return self;
}
/*
-(void)setX:(NSInteger)newX {
    x = newX;
    [self updateStringRepresentation];
}

-(void)setY:(NSInteger)newY {
    y = newY;
    [self updateStringRepresentation];
}
*/
-(void)updateStringRepresentation {
    self.asString = [NSString stringWithFormat:@"%i,%i",x,y];
}

-(void)dealloc {
    [asString release];
    [super dealloc];
}
@end

Пример проблемы:

Coordinates2D *coords = [[Coordinates2D alloc] initX:(NSInteger)(202.566223/200.00) Y:0.0f];
NSLog(@"202.566223/200.00 = %f, as int:%i, as NSInteger:%i, as Coordinates2D:%i",
      202.566223/200.00, (int)(202.566223/200.00), (NSInteger)(202.566223/200.00), coords.x);

Ответы [ 2 ]

0 голосов
/ 17 апреля 2011

Я прочитал некоторое время назад, что вы никогда не должны использовать средство доступа к свойству в методах инициализации.

0 голосов
/ 17 апреля 2011

Я думаю, вы хотите изменить:

@ свойство (неатомное) NSInteger x, y;

до:

@ свойство (неатомное, присваивать) NSInteger x, y;

Это должно исправить ошибку, так как она работает нормально, когда я помещаю ее в проект xcode.

...