2012-05-23 59 views
0

滿級代碼在這裏:http://pastebin.com/rdjDGLJSif語句不返回任何東西

編輯:從原來的海報採取了最新的代碼片斷評論

NSMutableString *spriteType; 


- (void) pickSpriteType { 

    randomSpriteNumber = arc4random() % 2+1; 

    switch (randomSpriteNumber) { 
     case 1: 
      spriteType = [NSMutableString stringWithFormat:@"typeOne"]; 
      break; 

     case 2: 
      spriteType = [NSMutableString stringWithFormat:@"typeTwo"]; 
      break; 
    } 
} 


- (void) findSpriteNumber { 

    levelNumberString = [NSMutableString stringWithFormat:@"%d",levelNumber]; 

    NSString *path = [[NSBundle mainBundle] pathForResource:@"plist_enemies" ofType:@"plist"]; 
    NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:path]; 
    spriteNumber = [[[dict objectForKey:spriteType] objectForKey:levelNumberString] intValue]; 
} 


- (void) initSprite { 
    [self moveUp]; 
    for(int i = 0; i<spriteNumber; i++) { 
     if ([spriteType isEqualToString:@"typeOne"]) { 
      NSLog(@"repeat"); 
     } 
     if ([spriteType isEqualToString:@"typeTwo"]) { 
      NSLog(@"repeat"); 
     } 
    } 
} 

原貼:

if語句我使用的是與一個NString使用以下代碼:

- (void) initSprite { 
    for(int i = 0; i<spriteNumber; i++) { 
     if (spriteType == @"typeOne") { 
      NSLog(@"repeat"); 
     } 
    } 
} 

只要字符串'spriteType'具有'typeOne'的內容,它應該記錄「重複」'spriteNumber'的次數,但沒有任何反應。它不記錄「重複」,但它也沒有任何錯誤。字符串'精靈類型'的內容肯定是'typeOne',spriteNumber> 0。

可以做些什麼來解決這個問題?

編輯:我現在已經嘗試了這樣的代碼:

- (void) initSprite { 
for(int i = 0; i<spriteNumber; i++) { 
if ([spriteType isEqualToString:@"typeOne"]) { 
    NSLog(@"repeat"); 
}}} 

它返回一個錯誤,EXC_BAD_ACCESS

+1

你確定你正確地發佈了代碼嗎?它缺少'[spriteType isEqualToString:@「typeOne」]' – borrrden

+0

@borrrden周圍的括號,我發佈了它與絞線代碼,即時通訊編輯知道。 – akuritsu

+0

@akuritsu,跟蹤spriteType是否在你的記憶中...... EXC_BAD_ACCESS只發生你的對象不在記憶中,那麼你也試圖訪問它。 – Tirth

回答

3

編輯:再。保留spriteType的值。

它看起來好像您試圖將spriteType用作類變量,但是您在設置它的值時不保留它。

spriteType = [NSMutableString stringWithFormat:@"typeOne"]; 

stringWithFormat:將返回一個自動釋放的NSString這將不會在其被調用的方法的範圍的外部進入。

讓spriteType在整個類中工作的最簡單方法是將其聲明爲@property - 在這兩種情況下,您都需要在.h文件中聲明該屬性&將其合成到.m文件中。

ARC

@屬性(非原子,強)的NSString * spriteType;

非ARC - 你會負責的dealloc釋放值

@屬性(非原子,保留)的NSString * spriteType;

ORIGINAL:

使用上一個NSString ==是檢驗字符串的兩個實例確實是相同的(指針等價)。

您需要使用的NSString方法isEqualToString:來測試對象等價這樣的 -

if ([spriteType isEqualToString:@"typeOne"]) 

isEqualToString:測試彼此的字符串變量的內容....

+0

編譯得很好,但是當我運行該方法時,它給了我一個錯誤。 EXC_BAD_ACCESS – akuritsu

+1

這是另一個問題。上面的代碼是絕對正確的。您可能會過度發佈'spriteType',但沒有代碼就無法說明。 「 – borrrden

+0

」意味着它們永遠不會相同「< - 聲明不準確。如果兩個字符串都是常量字符串,那麼指針等價將起作用。 – LearnCocos2D

3

不要使用==操作符的字符串。使用

if [string1 isEqualToString:string2] 
5

我等了很長時間纔有理由使用這個愚蠢的故事,我想到了編程世界中的兩種平等。想象一下,你和你重要的人一起去野餐。你深深愛上了,所以你給你們倆打包午餐,分享。如果有人要求你指出你的午餐,那麼你們都會指向相同的午餐。你的午餐是==彼此。現在讓我們說,你是大食客,所以你包含兩個不同的午餐,內容相同。現在當有人問你點你的午餐時,你會指出不同的午餐。你的午餐是!=。然而,如果你在裏面看看裏面的食物是什麼樣的,他們仍然有相同的內容。他們彼此是[isEqualTo]。你看到我要去哪裏?

午餐是一個對象,你和你的重要的其他人都是指針。當您使用==時,您測試指針等值(即哪個午餐是它),但這通常不是您想要的。你想對象等值(即午餐中的食物)。

總之,使用[isEqualTo]而不是== - >if([spriteType isEqualToString:@"typeOne"])

+0

+1:很好的故事:) –

+0

+1很好的解釋 – Damo

+0

很好的解釋,但它沒有解決我的問題。 – akuritsu