0

アプリの出力を実行すると、次の文字列がたくさん表示されます。

2012-05-12 14:41:52.542 PermTour[1688:15c0b] *** __NSAutoreleaseNoPool(): Object 0x5c39520 of class NSCFString autoreleased with no pool in place - just leaking

そして、私はコードのこの部分の問題を知っています。コメントすると出力が空になるからです。

 for(int i=0;i<[dataBase.allDataBase count];i++){
        aPLace = [dataBase.allDataBase objectAtIndex:i];
        name = [aPLace.name lowercaseString];
        description = [aPLace.description lowercaseString];
        if (!([name rangeOfString:searchText].location == NSNotFound) || !([description rangeOfString:searchText].location == NSNotFound)){
            [foundedPlaces addObject:aPLace];
        }

    }

何か案は?Thnx

UPD。

すべてのコードにコメントすると、次のようになります。

for(int i=0;i<[dataBase.allDataBase count];i++){
        aPLace = [dataBase.allDataBase objectAtIndex:i];
        name = [aPLace.name lowercaseString];
        //description = [aPLace.description lowercaseString];
        /*
        if (!([name rangeOfString:searchText].location == NSNotFound) || !([description rangeOfString:searchText].location == NSNotFound)){
            [foundedPlaces addObject:aPLace];
        }
         */

    }

まだメモリリークがあります。では、今何を書いていると思いますか?

UPD 2 ここに画像の説明を入力してください

4

2 に答える 2

2

大量のデータ(メモリ)を扱う場合は、常にを使用することをお勧めしますNSAutoreleasePool

編集 -

-(returnType)yourMethod:(returnType)parameter @autoreleasepool
{
    @autoreleasepool
    {
         //method body.
    }
}

これがお役に立てば幸いです。

于 2012-05-12T09:10:34.797 に答える
1

このエラーメッセージがクラス初期化メソッド(たとえば+initialize+loadまたは他のカスタムメソッド)であることを確認しました。

私にとっての解決策は、次のような自動解放プールを作成することでした。

@autoreleasepool
{
     initThis();
     [That init];
}

この@autoreleasepoolキーワードは、同様のセマンティクスを持つARCプロジェクトと非ARCプロジェクトの両方で使用できます。

これがこの問題に関する小さな印刷物です:

NSApplicationクラスは、初期化中およびイベントループ内、具体的には、その初期化(またはsharedApplication)および実行メソッド内で自動解放プール(NSAutoreleasePoolクラスのインスタンス)をセットアップします。同様に、アプリケーションキットがNSBundleに追加するメソッドは、nibファイルのロード中に自動解放プールを使用します。これらの自動解放プールは、それぞれのNSApplicationメソッドとNSBundleメソッドの範囲外ではアクセスできません。通常、アプリケーションは、イベントループの実行中、またはnibファイルからオブジェクトをロードすることによってオブジェクトを作成するため、このアクセスの欠如は通常問題にはなりません。ただし、main()関数自体の中でCocoaクラスを使用する必要がある場合(nibファイルのロードまたはNSApplicationのインスタンス化以外)、クラスを使用する前に自動解放プールを作成し、完了したらプールを解放する必要があります。 詳細については、 『Foundation Framework Reference』の「NSAutoreleasePool」を参照してください。

于 2012-05-12T09:19:54.283 に答える