1

アプリが大量のメモリを要求しているため、メモリの警告が表示されます。私はすべての割り当てを解放しようとします。とはいえ、やり方がわからないこともあります。

例: .h ファイルと .m ファイルの 2 つのペアがあります。それらの 1 つはサーバーとの接続を確立し、もう 1 つはローカル SQLite との接続を確立します。

通常、これらのファイルからメソッドを呼び出すコードは次のようになります。

-(NSMutableArray *) getRecentActivity{
    LocalStorageController *local = [[LocalStorageController alloc]init];
    return [local getRecentActivity];
}

getRecentActivity は NSMutableArray を返します。

そのコードでは、LocalStorageController にメモリを割り当てていることがわかりますが、リリース メソッドを呼び出すことはありません。したがって、その関数を呼び出せば呼び出すほど、より多くのメモリが割り当てられると思います。

初期化後に autorelease を呼び出すと、クラッシュします。

さらに、通常、私はこの別の種類のコードを使用します。

    ServerConnection *serv = [[ServerConnection alloc]init];
    NSMutableArray list = [serv getMyListOfContacts];

これは ASIHTTPRequest を使用し[serv release];、2 行目の後に呼び出すと、ASIHTTPRequest ライブラリの行を指す EXC_BAD_ACCESS でアプリがクラッシュします。

この状況をどのように管理すると考えられますか?

どうもありがとうございました!

4

2 に答える 2

2

最初のケースは簡単です。

-(NSMutableArray *) getRecentActivity{
    LocalStorageController *local = [[LocalStorageController alloc]init];
    NSMutableArray *tmp = [local getRecentActivity];
    [local release];
    return tmp;
}

2番目のケースは、実際のコードをもっと見ずに一般的な方法で解決するのは困難です。

于 2012-02-05T19:11:27.170 に答える
0

serv をプロパティとして使用すると、この保持/解放の問題が修正されます。

あなたの.hで:

@property (nonatomic, retain) ServerConnection *server;

あなたの.mで:

@synthesize server;

- (void)dealloc {
    [server release];
    // The rest of your releases here...
    [super dealloc];
}

- (void)yourMethod {
    ServerConnection *myServConnection = [[ServerConnection alloc] init];
    self.serv = myServConnection;
    [myServConnection release];
    NSMutableArray list = [self.serv getMyListOfContacts];
}

その時点からこのクラスで self.serv を使い続けるだけで、オブジェクトが解放されても問題はありません。

于 2012-02-05T20:12:46.870 に答える