4

最近、iPhoneのメモリ管理について調べた際、同じオブジェクトでコンビニエンスメソッドとinitメソッドを比較してみました。たとえば、ダウンロードした NSData を表示する UIImageView があります。

便利な方法:

imageView.image = [UIImage imageWithData:[downloads dataAtIndex:0]];

初期化方法:

UIImage *aImage = [[UIImage alloc] initWithData:[downloads dataAtIndex:0]];
imageView.image = aImage;
[aImage release];

ビューを行ったり来たりしてメモリ使用量を増やし、「Simulate Memory Warning」をクリックすると、アプリのメモリ使用量がコンビニエンス メソッドで 20MB から 18MB になり、init メソッドですぐに 20MB から 13MB になりました。

また、便利なメソッドの自動リリースでリリースする時間を与えるために、アプリを待って操作しました。でもあまり落ちませんでした。

オートリリースとリリース以外に、他に何が違いをもたらしましたか?

4

4 に答える 4

4

便利なメソッドによって作成された自動解放されたオブジェクトは、含まれている自動解放プールが空になるまで解放されません。頻繁に使用する場合は、メモリを集中的に使用する操作をNSAutoreleasePoolブロック内にラップすることをお勧めします。

于 2008-11-14T17:40:21.213 に答える
1

これを引き起こしている可能性がある唯一の違いは、imageWithData:がシステムイメージキャッシュを使用しないのに対し、initWithData:は使用することです。したがって、イニシャライザで作成されたイメージは、システムキャッシュに戻ることができるため、メモリ警告を受信したときにイメージデータを解放できますが、コンビニエンスメソッドで作成されたイメージは解放できません。

于 2008-11-14T09:42:29.803 に答える
1

ご存知のように、便利なメソッドで作成されたオブジェクトは自動解放されます。ただし、イメージを作成している RunLoop に AutoReleasePool がない場合、オブジェクトは存在しないプールに追加され、適切にクリーンアップされません。これは、スレッドで実行していて、そのスレッドの AutoReleasePool を作成するのを忘れた場合に当てはまります。

これに該当するかどうかを確認するには、Instruments (Leaks) を実行して、レポート内容を確認します。

于 2008-11-14T13:20:10.677 に答える
1

私が気付いたのは、自動解放されたオブジェクトを使用すると、メモリが不足している場合、プールをタイムリーに解放しないと、パフォーマンスが著しく低下するシステム GC が発生することです。

また、init / release メソッドを使用すると、ループ内のメモリ消費量を一定に保つことができますが、autorelease プールを使用するとスパイクが発生します。メモリが不足している状況では、自動解放プール内のオブジェクトが急速に増加すると、電子メールが開いている、モバイル サファリ タブ、実行中の iTunes などをシステムがクリーンアップする手順を実行する前に、アプリケーションが起動する場合があります。

要するに、アプリケーションのメモリ消費がより安定し、ランダムに起動される問題が少なくなるため、init をより多く使用する傾向があります。メモリ消費量が徐々に増加するため、デーモンはアプリを強制終了することなくシステムをクリーンアップできます。最後に、余談ですが、クラスで @property キーワードを使用している場合は、次のようなことに注意する必要があります。

myProperty = [NSMutableArray arrayWithCapacity:10];

main.m クラスのプールが収集されると、そのアイテムがなくなり、解放されたオブジェクトでメソッドを呼び出すためにクラッシュが発生するためです。@property (非アトミック、保持) で設定する場合は、次を使用します。

self.myProperty = [NSMutableArray arrayWithCapacity:10];

それがぶら下がっていることを確認します。ただし、 alloc init を使用するだけで、そのすべてを回避できます。参照カウントを監視して、メモリリークの原因となる二重参照がないことを確認してください。

于 2009-05-13T21:53:53.933 に答える