1

私はまだ iOS 開発を学んでおり、さまざまなチュートリアルや書籍を使用しています。ARC以前のものもあれば、ARC付きのものもあります。

場合によっては、viewDidUnload で ViewController のすべてのプロパティとサブビューを解放するように教えられますが、場合によっては、これは不要になったと言われています。

誰かが決定的な答えを与えることができますか?iOS 5以降では、全体を行う必要がありますか:

-(void)viewDidUnload
{
  [super viewDidUnload];
  self.photoViewCell = nil;
  self.photoImageView = nil;
  self.firstNameTextField = nil;
  self.lastNameTextField = nil;
}

... か否か?もしそうなら、これは UIView の子孫であるプロパティに対してのみですか、それとも ViewController のすべてのプロパティに対してですか?

ありがとう

4

3 に答える 3

8

したがって、各ビューには多数の所有者がいます。その「所有者数」(通常はretainCountと呼ばれます)が0に達すると、そのオブジェクトは破棄されます。

iOS 5では、弱参照があります。これは、本質的に「このオブジェクトを所有しない」ことを意味します。

iOS 5より前のヘッダーファイルには、次のように表示されます。

IBOutlet UILabel *myLabel;

そして、このラベルはXIBファイルのビューに追加されました。この場合、myLabelには2つの所有者がいます。それはsuperview(XIBファイル内のビュー)とView Controller(IBOutletを持つことによる)です。viewDidUnload getが呼び出されると、View Controllerのビューが解放されたため、myLabelの所有権は失われます。したがって、この時点でのmyLabelには、ビューコントローラという1人の所有者しかいません。そのため、viewDidLoadでリリースして、所有者がいないことを確認し、破棄する必要がありました。

iOS 5では、代わりにこれがよく見られます

__weak IBOutlet UILabel *myLabel

これは、ViewControllerをmyLabelの所有者にしたくないということです。したがって、唯一の所有者はビューコントローラのビューです。したがって、viewDidUnload getが呼び出されたとき、ビューコントローラのビューはすでに解放されているため、myLabelの所有権も解放されています。この場合、myLabelには所有者がなく、そのメモリが解放されます。self.myLabel=nil;の必要はありません。そこの。

したがって、iOS 5では、すべてのIBOutletsを弱参照にすることをお勧めします。これにより、すべてのメモリが自動的に処理されるため、viewDidUnloadを実装する必要もありません。

ただし、iOS 5を使用している場合でも、IBOutletsが弱参照でない場合は、viewDidUnloadにそのコードが必要になります。

于 2012-06-01T15:58:37.847 に答える
0

アプリに値する場合は、viewDidUnloadを使用してメモリを管理できます。

しかし、しないでください

myInstanceVariable = nil;

変数の値が存在するメモリ位置への参照を失います。

=nilはメモリを解放しません。それでも、オブジェクトの割り当てを解除する必要があります。したがって、retainCountとretain/releaseが使用されます。

viewDidUnloadでオブジェクトをゼロにすると、deallocで解放できなくなります。注意!!!

あなたが知っているなら、あなたが何をしているのか、あなたはviewDidUnloadであなたのオブジェクトを解放してnilすることができます。

アーク:

ARCを使用している場合は、手動でリリースしてはいけません。そうすることはできないと思います。ARCがそれを処理します。(weak / strong)属性で可能な限り@propertiesを使用するだけで、ゲッターとセッターが作業を行うことができます。.mファイルで@propertiesを宣言することもできます(クラス拡張子のように)。

単純なルール:所有したいオブジェクトには強い、オブジェクトには弱い、保持サイクルで迷子になり、所有権を保持したくない。ARCはほとんどすべての状況で残りを行います。たとえば、デリゲートにはweakを使用します。

nilオブジェクトは、確実な場合はメッセージを送信しません。それ以外の場合は送信しません。

于 2012-06-01T16:18:38.453 に答える
0

viewDidUnload は、自動であろうとなかろうと、保持カウントとは何の関係もありません。このメソッドは、メモリ不足のためにビューがアンロードされたときに呼び出されます。つまり、強い参照を保持しているビューの要素も nil (およびリリース、非 ARC) する必要があります。これを行わないと、メモリが不足しているときにアプリが十分なメモリを解放できず、OS によってアプリが閉じられる可能性があります。

于 2012-06-01T16:00:44.403 に答える