5

私は私が遊んでいる小さな基礎ツールテスト(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のバグのようですが、誰かアイデアはありますか?

最後に、私が間違っていることは何でも、アイデアは、「Planet_001」から「Planet_010」までの10個の文字列で配列を埋めることです。

編集:ああ、なるほど、それは「=[NSString」ビットのせいです。

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

どうもありがとう、大いに感謝-gary-

4

3 に答える 3

5

tempString実際には文字列リテラルではありません。文字列リテラルです@"Planet_%03d" tempStringこれは、NSAutoreleasePool がドレインされると解放されることを意味する、autoreleased オブジェクトです。基本的に、メモリは既に管理されており、何もする必要はありません。

ルールとおりです。newalloccopyretainreleaseそれ以外の場合、メモリはおそらく自動解放によって既に管理されています。

また、リリースするのを忘れていましたpool。それ以外は問題ないようです。

于 2009-09-14T23:19:39.317 に答える
1

「unable to read unknown load command 0x80000022」エラーの考えられる理由の 1 つは、開発者ツールを同時にアップグレードせずに Snow Leopard にアップグレードしたことが原因のようです。10.5 バージョンを XCode に使用して 10.6 環境でコンパイルしようとすると、エラーが発生する可能性があるようです。明日これを調べます。

Xcode 3.2 が Snow Leopard (Mac OS X 10.6) リリースで利用できるようになりました。Snow Leopard をインストールしたら、Xcode Tools ディスク イメージとは別にインストールして、Xcode 3.2 にアップグレードします。Xcode の以前のバージョンの上にインストールするか、インストールする前にそれらを脇に移動することができます。

PS: 「unable to read unknown load command 0x80000022」というエラーが表示されたとき、xCode 3.1.2 で OSX 10.6.1 を実行していました。

乾杯 -ゲイリー-

于 2009-09-14T22:42:32.610 に答える
0

その「load command」エラーは、実行形式が iPhone OS 3.0 から iPhone OS 3.1 に変更されたためです。

http://networkpx.blogspot.com/2009/09/about-lcdyldinfoonly-command.html

于 2010-01-06T02:20:15.823 に答える