0

我为此撕毁了我的头发。我不知道出了什么问题。

我创建了一个非常简单的 Coordinates2D 类来存储两个 NSInteger 值,以及一个用于 NSLog 的字符串表示形式。我在与最新版本的 xCode 捆绑的 iOS 4.3 iPad 模拟器中运行此代码。

由于某种原因,传递给 initX:Y: 构造函数的整数值丢失了。下面的代码提供 Coordinates2D 和一些代码,以原始形式打印任意浮点值,转换为 int,转换为 NSInteger,然后在 Coordinates2D 对象中。

您应该像我一样看到该值在 Coordinates2D 构造函数中丢失了;NSLog 中的 'coords.x' 参数被打印为一个随机的大整数,表明它的值已在内存中丢失。

谁能帮我看看为什么会这样?我看不出我做错了什么。

非常感谢!

坐标2D.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

坐标2D.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);
4

2 回答 2

0

前段时间我读到你永远不应该在 init 方法中使用属性访问器。

于 2011-04-17T00:48:07.977 回答
-2

我想你想改变:

@property (nonatomic) NSInteger x,y;

至:

@property (nonatomic, assign) NSInteger x,y;

这应该可以解决错误,因为当我将它放入 xcode 项目时它运行良好。

于 2011-04-17T00:13:37.033 回答