-1

最初の質問

オブジェクトのプロパティがObjective-Cに保持されている場合、同じクラスの2番目のインスタンスが同じオブジェクトを指すのはなぜですか?新しいクラスをインスタンス化する場合は、論理的には、個別のプロパティを持つ個別のクラスが必要になります。retain私は、保持数を増やすだけで、copyコピーを浅くすることを理解しています。

を保持するクラスを作成しましたNSURLRequest。そのクラスの2つのインスタンスを初期化しました。作成されたクラスのいずれかのプロパティを変更すると、すべてのクラスが変更されます。プロパティでコピーを使用すると、それが停止しました。ただし、オンラインで読むとcopy、不変オブジェクトは変更できないため、個別のエンティティは実際には必要ないため、本質的に浅いコピーであると言われています。この場合、は不変ですが、不変のオブジェクトを深くコピーしたと思われるオブジェクトNSURLRequestを呼び出すことで、私の例はどのように機能しましたか?copyこれが私がそれをコピーした方法です:

- (id)initWithRequest:(NSURLRequest *)request {

    self = [super initWithNibName:nil bundle:nil];
    if (self) {
        _request = [request copy];
    }

    return self;
}

2番目の質問

私は、本質的にすべての不変オブジェクトに対して、使用する必要がcopyあり、可変オブジェクトに対して使用する必要があることを読んでいますretain(または現在ARCでstrong)。IBOutletsがweakポインターの場合、Interface Builderなしでビューを描画するとどうなりますか?UIKit要素はcopyまたはretain/strongですか?

ありがとう!

4

1 に答える 1

0

保持は、元のプロパティまたはポインターがそれ自体を nil に設定して保持カウントを減らす場合でも、そのメモリを解放しないように iOS に指示します。したがって、既存のオブジェクトに1つのポインターを割り当てる浅いコピーを行うと、それは保持されます。ディープ コピーを実行する必要がある場合は、copy を指定するか、コピー コンストラクターを作成する必要があります。

弱い参照は、保持カウントをインクリメントしたくないメモリの一部に対して「割り当て」の古い方法を使用することに似ています。循環参照を持つことができ、メモリを解放できない可能性がある状況があります。IB を使用して UIKit オブジェクトを作成しない場合、そのオブジェクトへの有効なポインタがあると仮定すると、ARC は確実にメモリを保持します。たとえば、ビュー コントローラーのメンバーとして UIButton ポインターがあり、ボタンを動的に作成する場合、ポインターが有効である限りそのメモリを保持し、ポインターが nil に設定されると解放します。

于 2012-06-27T19:06:59.963 に答える