2009-09-14 122 views
5

我有一點基礎的工具測試(Objective-C的),我有玩,我有幾個問題...將字符串對象添加到NSMutableArray?

#import <Foundation/Foundation.h> 

int main (int argc, const char * argv[]) { 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

    int planetLoop; 
    NSString *tempString; 
    NSMutableArray *planetArray = [[NSMutableArray alloc] init]; 

    NSLog(@"STRING ARRAY ... Start"); 
    for(planetLoop=0; planetLoop<10; planetLoop++) { 
     tempString = [NSString stringWithFormat: @"Planet_%03d", planetLoop+1]; 
     NSLog(@"Planet_%03d", planetLoop+1); 
     [planetArray addObject:tempString]; 
    } 

    [planetArray release]; 
    [pool drain]; 
    return 0; 
} 

首先,平時我釋放對象將其添加到一個數組後,但我正確地認爲我目前所擁有的是正確的,因爲「tempString」是一個字符串文字,因此不需要分配或釋放?其次,當我運行這個(在執行之前)時,我得到下面的錯誤「無法讀取未知的加載命令0x80000022」,如果這是我的代碼的問題?從搜索谷歌它看起來可能是一個錯誤在xCode 3.1.2,任何人有任何想法?

最後什麼我做錯了,這個想法是通過對「Planet_010」

編輯,以填補10字符串「Planet_001」的數組:啊,我明白了,因爲「= [NSString的」位的多數民衆贊成即

// Autoreleased object 
tempString = [NSString stringWithFormat: @"Planet_%03d", planetLoop+1]; 
// String literal 
tempString = @"Planet_"; 

千恩萬謝,感激-gary-

回答

5

tempString實際上不是字符串字面量。 @"Planet_%03d"一個字符串文字。 tempString是一個自動釋放對象,意味着它將在NSAutoreleasePool耗盡時釋放。基本上,內存已經被管理,你不必做任何事情。

規則是:如果newalloccopyretain一個對象,那麼你必須release它。否則,內存已經被管理,可能是通過autorelease。

此外,您忘記發佈 pool。除此之外,它看起來很好。

+1

他確實發佈了游泳池:[pool drain] – 2009-09-15 02:50:37

+0

謝謝你們,我現在看到發生了什麼事,上面的小編輯來解釋... – fuzzygoat 2009-09-15 06:26:51

+0

@Chris你說得對。我沒有意識到'漏'這個'釋放'。 – 2009-09-15 12:34:11

1

一個可能的原因爲「無法讀取未知加載命令0x80000022」的錯誤似乎是,我已經升級到雪豹而不升級開發工具在同一時間。看起來錯誤可能是由於嘗試使用XCode的10.5版本在10.6環境中編譯造成的。我明天會看看這個。

Xcode 3.2現已發佈於Snow Leopard(Mac OS X 10.6)發行版中。安裝Snow Leopard後,通過與Xcode Tools磁盤映像分開安裝來升級到Xcode 3.2。您可以將其安裝在Xcode的以前版本中,或者在安裝之前將它們移到一邊。

PS:當我拿到 「無法讀取未知加載命令0x80000022」 的錯誤,我正在運行OSX 10.6.1和Xcode 3.1.2

歡呼-gary-

+0

如果您的工具不符合您所使用的操作系統版本同步,先解決這個問題。這是一種已知的不穩定配置。 – NSResponder 2009-09-14 23:21:13