2014-02-12 58 views
0

我有下面的代碼,它只是讀一堆卡,並將它們的名稱輸入到可變數組中,如果它們事先不存在的話。爲什麼此Objective C代碼中的對象未設置?

int main(int argc, const char * argv[]) 
{ 

    @autoreleasepool { 
     NSMutableArray *allCards = [[NSMutableArray alloc] init]; 
     char cardAvailable = '\0'; 
     do { 
      Card *newCard = [[Card alloc] init]; 
      NSLog(@"What is the Card Name ?\n"); 
      char cName[20]; 
      scanf("%s",cName); 
      NSString *nName = [NSString stringWithCString:cName encoding:1]; 
      [newCard setName:nName]; 
      if([newCard wasMatch:allCards]) { 
       NSLog(@"Card Already Present"); 
      } else { 
       NSLog(@" NEW CARD NAME %@ %@ %s",[newCard getName],newCard.name, cName); 
       [newCard addGlobal:newCard toArray:allCards]; 
      } 
      NSLog(@"Is there another Card to Input?"); 
      scanf("%c",&cardAvailable); 
     } while(cardAvailable != 'N' || cardAvailable != 'n'); 

     NSLog(@":::: Card Names Are ::::"); 
     for(Card *card in allCards) 
     { 
      NSLog(@"%@",card.name); 
     } 
    } 
    return 0; 
} 

但是,第一個 - 名稱簡直沒有設置。我不知道爲什麼會發生這種情況。今天是我第一次使用Objective C的第一天,所以如果這太簡單,請原諒我。

的卡類文件 -

#import <Foundation/Foundation.h> 

@interface Card : NSObject 

    @property(nonatomic) BOOL chosen; 
    @property (nonatomic, getter = getName) NSString *name; 

    -(BOOL)wasMatch:(NSMutableArray*) allCards; 
    -(void)addGlobal:(Card*) aCardName toArray:(NSMutableArray*) allCards; 
    -(void)setName:(NSString *)name; 
    -(void)setChosen:(BOOL)chosen; 
@end 

我這裏得到的錯誤 - 在添加全局線。

#import "Card.h" 

@implementation Card 

@synthesize chosen = _chosen; 

-(BOOL)chosen 
{ 
    return _chosen; 
} 

-(void)setChosen:(BOOL)chosen 
{ 
    _chosen = chosen; 
} 

@synthesize name = _name; 

-(NSString*)getName 
{ 
    return _name; 
} 

-(void)setName:(NSString*)name 
{ 
    name = _name; 
} 

-(BOOL)wasMatch:(NSMutableArray *)allCards 
{ 
    for(Card *card in allCards) 
    { 
     if([self.name isEqualToString:card.name]) 
     { 
      return true; 
     } 
    } 
    return false; 
} 

-(void)addGlobal:(Card *)aCardName toArray:(NSMutableArray *)allCards 
{ NSLog(@" THE NS STRING %@",aCardName.name); 
    [allCards addObject:aCardName.name]; 
} 

@end 

回答

1

你的傳球員是錯的。

-(void)setName:(NSString*)name 
{ 
    name = _name; 
} 

將當前實例變量(_name)分配給參數。

這應該是相反的方式。

-(void)setName:(NSString*)name 
{ 
    _name = name; 
} 

但是你根本不需要這個。您的代碼存在各種問題。

  • Objective-C不使用getFoo來處理普通的getter。
    @property (nonatomic, getter = getName) NSString *name;應該
    @property (copy, nonatomic) NSString *name;

,除非你是在一個古代版的Objective-C(你不應該)你不需要明確的getter和setter方法的編寫代碼。在最近的版本中,你甚至不需要明確合成。
在Objective-C的新版本的卡類應該看起來更像是這樣的:

@interface Card : NSObject 

@property (assign, nonatomic) BOOL chosen; 
@property (copy, nonatomic) NSString *name; 

-(BOOL)wasMatch:(NSMutableArray*) allCards; 
-(void)addGlobal:(Card*) aCardName toArray:(NSMutableArray*) allCards; 
@end 

#import "Card.h" 

@implementation Card 

-(BOOL)wasMatch:(NSMutableArray *)allCards 
{ 
    for(Card *card in allCards) 
    { 
     if([self.name isEqualToString:card.name]) 
     { 
      return YES; 
     } 
    } 
    return NO; 
} 

-(void)addGlobal:(Card *)aCardName toArray:(NSMutableArray *)allCards 
{ NSLog(@" THE NS STRING %@",aCardName.name); 
    [allCards addObject:aCardName.name]; 
} 

@end 

方式更少的代碼。您可能想要尋找更新的學習資源。

其餘代碼看起來也有問題。我真的沒有看到addGlobal:toArray:中的觀點。但我不想讓這個答案超過必要的時間。 ;-)


而且,對於你未來的愛自己,不要用1 NSString *nName = [NSString stringWithCString:cName encoding:1];使用常量。在你的情況NSASCIIStringEncoding。但是因爲它不再是1980年代,所以最有可能使用NSUTF8StringEncoding而不是ASCII。

正如我所說,請獲得更多近期和體面的學習資源。

+0

好答案。非常感謝。你會推薦任何資源? –

0

-setName:屬性訪問器方法中,您將_name實例變量值分配給name參數。它應該這樣交換:

-(void)setName:(NSString*)name 
{ 
    _name = name; 
} 
0

要學習Objective-C,我回顧了Paul Hegarty最近的斯坦福講座。 CS193p類被調用。您可以在iTunes U上找到所有素材和優秀視頻。除了蘋果資源之外,沒有比這更好的了。

+0

這實際上是他在第一場演講中所做的事實。我想我會實施一些。 –

相關問題