2010-07-04 45 views
0

我正在通過「iPhone開發:大書呆子牧場指南」。該項目是「隨機擁有」。我忠實地按照書中的代碼,它編譯OK,但我得到運行時此異常:NSInvalidArgumentException

 
    **2010-07-04 11:43:48.511 RandomPosessions[14828:a0f] -[Posession initWithPosessionName:valueInDollars:serialNumber:]: unrecognized selector sent to instance 0x10010d1f0 
2010-07-04 11:43:48.514 RandomPosessions[14828:a0f] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[Posession initWithPosessionName:valueInDollars:serialNumber:]: unrecognized selector sent to instance 0x10010d1f0' 
*** Call stack at first throw: 
(
    0 CoreFoundation      0x00007fff80b4bcc4 __exceptionPreprocess + 180 
    1 libobjc.A.dylib      0x00007fff8044b0f3 objc_exception_throw + 45 
    2 CoreFoundation      0x00007fff80ba5140 +[NSObject(NSObject) doesNotRecognizeSelector:] + 0 
    3 CoreFoundation      0x00007fff80b1dcdf ___forwarding___ + 751 
    4 CoreFoundation      0x00007fff80b19e28 _CF_forwarding_prep_0 + 232 
    5 RandomPosessions     0x00000001000016c2 +[Posession randomPosession] + 995 
    6 RandomPosessions     0x0000000100001196 main + 170 
    7 RandomPosessions     0x00000001000010e4 start + 52 
) 
terminate called after throwing an instance of 'NSException'** 

這是我對「RandomPosession」的實現代碼:

#import "Posession.h" 


@implementation Posession 
@synthesize posessionName, serialNumber, valueInDollars, dateCreated; 

-(NSString *) description { 
    NSString *descriptionString = 
     [[NSString alloc] initWithFormat:@"%@ (%@): Worth $%@, Recorded on %@", 
       posessionName, 
       serialNumber, 
       valueInDollars, 
     dateCreated]; 
    return descriptionString; 

} 

+(id)randomPosession 
{ 
     static NSString *randomAdjectiveList[3] = 
    { 
      @"Fluffy", 
      @"Rusty", 
      @"Shiny" 

    }; 
    static NSString *randomNounList[3] = 
    { 
      @"Bear", 
      @"Spork", 
      @"Mac" 
    }; 

    NSString *randomName = [NSString stringWithFormat:@"%@ %@", 
           randomAdjectiveList[random() % 3], 
          randomNounList[random() % 3]]; 
    int randomValue = random() % 100; 

    NSString *randomSerialNumber = [NSString stringWithFormat:@"%c%c%c%c%c", 
            '0' + random() % 10, 
            'A' + random() % 26, 
            '0' + random() % 10, 
            'A' + random() % 26, 
            '0' + random() % 10]; 

    Posession *newPosession = 
     [[self alloc] initWithPosessionName:randomName 
          valueInDollars:randomValue 
          serialNumber:randomSerialNumber]; 

    return newPosession; 

} 

-(id)init{ 
    return [self initWithPosessionName:@"Posession" 
         valueInDollars:0 
          serialNumber:@""]; 

} 
-(id)initWithPosessionName: (NSString *)pName 
      valuesInDollars:(int)value 
       serialNumber:(NSString *)sNumber{ 
    [super init]; 

    if(!self) 
     return nil; 

    [self setPosessionName:pName]; 
    [self setSerialNumber:sNumber]; 
    [self setValueInDollars:value]; 
    dateCreated = [[NSDate alloc] init]; 

    return self; 

} 

-(id)initWithPosessionName:(NSString *)pName { 
     return [self initWithPosessionName:pName 
          valuesInDollars:0 
           serialNumber:@""]; 

} 



@end 

我把我的頭髮拔出來! 我想感謝所有幫助 乾杯

回答

1

您需要格式化您的輸入更好....

但是你的問題是你所定義的方法不正確地

-(id)initWithPosessionName: (NSString *)pName valuesInDollars:(int)valueserialNumber:(NSString *)sNumber 

,應該是

-(id)initWithPosessionName: (NSString *)pName valueInDollars:(int)valueserialNumber:(NSString *)sNumber 

您有一個額外的「

我幾乎可以保證Xcode給你關於這個的警告。在Objective-C中,警告通常會導致運行時崩潰,如此。在放棄問題之前清理所有警告是個好習慣。

+0

不想成爲一自作聰明,但它是方法的定義,而不是聲明。 – 2010-07-04 08:44:06

+0

謝謝約書亞。我知道它就像一個錯字一樣簡單 - 很好的發現!我會盡量注意警告,但如果我不知道他們指的是什麼,這無助於你。我定了錯別字,但現在我得到另一些警告,並在 吐假 - (的NSString *)的說明{ \t的NSString * descriptionString = \t \t [的NSString頁頭] initWithFormat:@「%@(%@ ):價值$%@,電話錄音%@」, \t \t \t \t posessionName, \t \t \t \t SERIALNUMBER, \t \t \t \t valueInDollars, \t \t dateCreated會]。 \t return descriptionString; \t } (對象超出範圍) 問題是我甚至沒有調用描述方法 – BernardH 2010-07-04 11:38:21

+0

@Nikolai,當然,我的壞。編輯修復。 – 2010-07-04 18:01:27

相關問題