0

(私の英語で申し訳ありません:-) カスタム UITableViewCell を読み込んでいます:

static NSString *CellIdentifier = @"ReminderCell";
ReminderCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil) {
    NSLog(@"Alloco nuova cella");
    NSArray *objectsInNib = [[NSBundle mainBundle] loadNibNamed:@"ReminderCell" owner:nil options:nil];
    for(id currentObject in objectsInNib)
    {
        if([currentObject isKindOfClass:[ReminderCell class]])
        {
            cell = (ReminderCell *)currentObject;
            break;
        }
    }
} //fine caricamento cella dal Nib

return cell;

このセルには .m と .h があり、UITableViewController ではなく、独自のファイル内にアウトレットを配置したいので、所有者を nil に設定しています。正常に動作しています。

私の質問は、この状況での正しいメモリ管理についてです。

loadNibNamed が自動解放された配列を返すことを理解しています。さらに、現在のループの最後に自動解放プールが空になることを理解しています。このため、カスタム セルを返却する前に保持する必要はありません。

しかし、自動解放されたオブジェクトは、自動解放が送信されたメソッドの最後までのみ存続することが保証されていると想定すべきだと何度も聞いたことがあります。これを前提として、セルをすぐに保持してから自動解放する必要があります。

cell = [[(ReminderCell *)currentObject] retain];
//code...
[cell autorelease];
return cell;

これは正しいですか、それとも心配する必要はありませんか? ありがとう

4

1 に答える 1

0

これは必要ありません。オブジェクトはそうではありませんguaranteed to live only until the end of the method where the autorelease was sent-メソッドはここでは無関係です。オブジェクトは、メソッドによって追加された自動解放プールautoreleaseが排出された後に解放されます。メソッドには自動解放プール管理がないため、実行中にcurrentObject受信しません。release

例(もちろんARCなし):

id obj;
NSAutoreleasePool *pool = [NSAutoreleasePool new];
...
obj = [other object];
...
[pool drain];

[obj doSomething]; // DANGEROUS

あなたの場合、それは次のようなものです。

id obj;
...
obj = [other object];
...
[obj doSomething]; // SAFE
于 2012-03-19T11:05:51.377 に答える