1

シングルトンである私のデータベースマネージャーを考えてみましょう。

+ (SWDatabaseManager *)retrieveManager
{
    @synchronized(self)
    {
       if (!sharedSingleton)
       {
           sharedSingleton = [[SWDatabaseManager alloc] init];
       }
       return sharedSingleton;
    }
}

- (NSArray *)getProductDetails:(NSString *)someString 
{
    NSArray *temp = [self getRowsForQuery:someString];
    return temp;
}

- (NSArray *)getRowsForQuery:(NSString *)sql
{
    sqlite3_stmt *statement=nil;
    NSMutableArray *arrayResults = [NSMutableArray arrayWithCapacity:1];
    //
    //Fetching data from database and adds them in to arrayResults
    //
    return arrayResults;
}

今、いくつかのView Controllerから、このようにデータベースマネージャーの機能を呼び出しています....

[self getProductServiceDidGetDetail:[[SWDatabaseManager retrieveManager] getProductDetail: @"SomeQuery"]

- (void)getProductServiceDidGetDetail:(NSArray *)detailArray 
{
    [self setDataSource:[NSArray arrayWithArray:detailArray]];
    [self.tableView reloadData];
}

質問は... getRowsForQuery の arrayResult はいつリリースされますか?

getProductServiceDidGetDetail の detailArray に nil を割り当てる必要がありますか?

メモリリークはありますか?

提案をいただければ幸いです。

4

1 に答える 1

0

ARC は自動メモリ管理を行います。したがって、使用が完了すると、すべて(アレイ)が解放されます。

ARC はコンパイル時にコードを追加して、オブジェクトが必要なだけ存続するようにしますが、それ以上存続しないようにします。概念的には、適切なメモリ管理呼び出しを追加することにより、手動参照カウント (Advanced Memory Management Programming Guide で説明) と同じメモリ管理規則に従います。

理解を深めるために、 ARCのapples ドキュメントを読むとよいでしょう。

配列に nil を割り当てる必要はなく、メモリ リークを心配する必要もありません。

インスタンス変数を解放する必要はありません (実際には解放できません) が、ARC を使用してコンパイルされていないシステム クラスやその他のコードで [self setDelegate:nil] を呼び出す必要がある場合があります。

于 2013-09-03T17:08:04.677 に答える