0

私のクラスの dealloc メソッドでは、

- (void) dealloc
{
    [searchField release]; 
    [super dealloc];
}

クラス変数で searchField が定義されている場所。

@interface SearchCell : UITableViewCell
{
    UISearchBar *searchField;
    id delegate;
}

クラスは次の方法で使用されます。

if (indexPath.section == 0)
    {
        SearchCell *mycell = [[SearchCell alloc] init];
        [cell setDelegate:self];
        return [mycell autorelease];
    }

searchField はここで作成されます:

- (id) init
{
    self = [super initWithFrame:CGRectZero];

    [self create];

    return self;
}

- (void) create
{
    searchField = [[UISearchBar alloc] initWithFrame:CGRectZero];
    searchField.autocorrectionType = UITextAutocorrectionTypeNo;    
    [self addSubview:searchField];
}

[searchField release]; を使用する必要がありますか? 私のdeallocで?アプリケーションが次のメッセージでクラッシュします: "* [UISearchBar RespondsToSelector:]: 割り当て解除されたインスタンスに送信されたメッセージ * "。

4

2 に答える 2

1

いいえ、そこでリリースしないでください。「autorelease」で返すので、イベントループを次に実行すると、保持カウントが自動的に減少します。

最終的に「dealloc」メソッドを実行すると、保持カウントはすでに0になり、アプリは例外を発生させます。

于 2012-10-01T10:03:53.667 に答える
0

オブジェクト所有権の規則に注意する必要があります。(ARC とは対照的に) 手動の保持および解放環境では、Objective-C オブジェクトのルールは頭字語NARCで覚えることができます。

newまたはallocを使用して新たに作成したオブジェクト、retainを呼び出したオブジェクト、別のオブジェクトに対してcopyまたはmutableCopyを呼び出して作成したオブジェクト、または任意の文字列で始まるメソッドによって作成されたオブジェクトへの参照がある場合これらの名前 (例: newInstance) の場合、 そのオブジェクトを所有し、割り当てを解除する前に解放する必要があります。

しかし、あなたがこれらのことを何もしなかった場合、あなたはその objectを所有していないので、それを解放してはなりませんソース

あなたの場合、値を設定したコードは表示されませんsearchFieldが、クラッシュから、オブジェクトの所有権を取得することはないと思います。割り当て先のコードを表示するsearchFieldと、確実にわかります。 EDIT:で作成することで所有権を取得しallocます。releaseそこを に保つ必要がありdeallocます。どこかからリリースされているのでしょうか?それとも、セル自体が過剰に放出されている可能性がありますか?

于 2012-10-01T10:17:59.140 に答える