2010-12-08 77 views
0

幾天後我回到了我的一個ipad項目,並且發生了奇怪的事情。應用程序在我離開時運行得很好。傳遞給功能時參數值發生變化

我有很簡單的構造非常簡單的類

@interface MapPathPoint : NSObject { 
    int mX, mY; 
} 

- (id)initWithX:(int)x Y:(int)y; 

@property int x, y; 

@end 

@implementation MapPathPoint 

@synthesize x = mX, y = mY; 

- (id)initWithX:(int)x Y:(int)y { 
    if(self = [super init]) { 
    mX = x; 
    mY = y; 
    } 
    return self; 
} 

@end 

當我打電話

MapPathPoint *start = [[MapPathPoint alloc] initWithX:posX Y:posY]; 

我的MX和我將含有垃圾,不值我送。我甚至試圖用常數發送它

MapPathPoint *start = [[MapPathPoint alloc] initWithX:1 Y:0]; 

和結果是一樣的。當我調試它並進入init函數時,x和y的值看起來像內存中的隨機值。我嘗試清理/重建多次,重新啓動Xcode和我的Mac和iPad,但沒有任何幫助。只有自從我上次在該項目上工作以來發生的變化(據我所知)ipad操作系統更新到4.2.1(從3.2我認爲)

任何想法可能是什麼錯?

編輯: 當我將參數類型更改爲浮動時,一切都按預期工作。如果我使用int或unsigned int,則獲得在我的評論中指定的值。如果我嘗試使用unsigned short,我得到的全部爲0.

+0

我看到這段代碼沒有錯。你完全肯定你傳入了兩個int文字,但仍然看到了錯誤的值?你看到了什麼值? – 2010-12-09 03:27:33

+0

是的,我絕對肯定我通過了兩個字面值,你看到的是從我的代碼複製粘貼,並通過幾十個調試會話進行驗證。貌似值是0,如果我送0,1065353216(0x3f800000)1,1073741824(0x40000000之後)2 – Lope 2010-12-09 08:49:16

回答

0

我發現了這個問題,但我仍然不知道到底是怎麼回事。 我有完全不同的類,使用相同的名稱初始化函數只有它接受浮點值。它有點混合。當我刪除這個浮點類或重命名它的初始化函數時,一切正常。

下面是一些測試情況下,我做

@interface FloatClass : NSObject { 
} 

- (id)initWithX:(float)x Y:(float)y; 

@end 

@interface IntClass : NSObject {  
} 

- (id)initWithX:(int)x Y:(int)y; 

@end 

@implementation IntClass 

- (id)initWithX:(int)x Y:(int)y { 
    if(self = [super init]) { 
    NSLog(@"IntClass: %i %i", x, y); 
    } 
    return self; 
} 

@end 

@implementation FloatClass 

- (id)initWithX:(float)x Y:(float)y { 
    if(self = [super init]) { 
    NSLog(@"FloatClass: %f %f", x, y); 
    } 
    return self; 
} 

當我使用這些類

[[IntClass alloc] initWithX:1 Y:2]; 
[[FloatClass alloc] initWithX:1 Y:2]; 

結果是

IntClass: 1065353216 1073741824 
FloatClass: 1.000000 2.000000 

這是錯誤我應該報告或功能,我沒不知道?當然看起來像bug,但我已經看到了我生活中的陌生人功能:)

1

您可能需要直接使用生成的訪問器,而不是直接使用成員變量,特別是在init時。也許底層代碼生成已從3更改爲4.

- (id)initWithX:(int)ax Y:(int)ay { 
    if(self = [super init]) { 
    self.x = ax; 
    self.y = ay; 
    } 
    return self; 
} 
+0

問題是,斧頭和y已經搞砸了,之前我將它們分配給成員變量 – Lope 2010-12-08 22:00:11

0

可能是參數/屬性名稱的問題。嘗試重新命名x/y的參數與這些不同。

我在想,你不小心將屬性的值分配給你的變量。

+0

不,沒有運氣:(我重命名它們和結果與之前一樣 – Lope 2010-12-08 22:15:06

0

你的問題是,你的屬性創建x和y實例變量,這樣做:

mX = x; 
mY = y; 

實際上是試圖分配實例變量x和y爲MX和我,而不是x和y作爲init方法的參數傳遞。 ivars不習慣通過屬性創建,也沒有在界面中明確設置它們 - 現在它們已經完成了。

試試這個:

@interface MapPathPoint : NSObject { 
    int mX, mY; 
} 

- (id)initWithX:(int)x Y:(int)y; 

@property int x, y; 

@end 

@implementation MapPathPoint 

@synthesize x = mX, y = mY; 

- (id)initWithX:(int)xx Y:(int)yy { 
    if(self = [super init]) { 
    mX = xx; 
    mY = yy; 
    } 
    return self; 
} 

@end 
相關問題