NSMutableArrayに文字列オブジェクトを追加しますか?
-
07-07-2019 - |
質問
プレイしている基礎ツールテスト(Objective-C)が少しあり、いくつか質問があります...
#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のバグのように見えますが、誰でもアイデアがありますか?
最後に私が間違っていることは何でも、アイデアは配列に10文字列「Planet_001」を入れることです。から&quot; Planet_010&quot;
まで編集:ああ、それは&quot; = [NSString&quot;ビット
// Autoreleased object
tempString = [NSString stringWithFormat: @"Planet_%03d", planetLoop+1];
// String literal
tempString = @"Planet_";
多くの感謝、感謝-gary-
解決
tempString
は実際には文字列リテラルではありません。 @&quot; Planet_%03d&quot;
は文字列リテラルです。 tempString
は自動解放されたオブジェクトです。つまり、NSAutoreleasePoolが空になると解放されます。基本的に、メモリはすでに管理されており、何もする必要はありません。
ルールは次のとおりです。 new
、 alloc
、 オブジェクトをコピー
または 保持
した後、 リリース
する必要があります。それ以外の場合、おそらく自動解放によってメモリが既に管理されています。
また、 pool
のリリースを忘れました。それ以外は問題ありません。
他のヒント
「不明なロードコマンド0x80000022を読み取れません」の理由として考えられるのは、エラーは、開発者ツールを同時にアップグレードせずにSnow Leopardにアップグレードしたということのようです。 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を読み取れません」というメッセージが表示されたときxCode 3.1.2でOSX 10.6.1を実行していたエラー
歓声-gary-
&quot;ロードコマンド&quot;エラーは、実行可能形式がiPhone OS 3.0からiPhone OS 3.1に変更されたという事実によるものです。
http://networkpx.blogspot.com/2009/09 /about-lcdyldinfoonly-command.html