1

Objective-C クラスで静的リソースを使用する場合、解放しないとメモリ リークが発生しますか? 次のようなもの:

@interface MyClass : NSObject

+ (MyClass *)sharedInstance;

@end

@implementation MyClass

+ (MyClass *)sharedInstance
{
    static MyClass * inst;
    if (!inst)
        inst = [MyClass new];
    return inst;
}

@end

A) このクラスを使用するアプリケーションが終了し、この静的宣言がメモリ リークを引き起こすシナリオはありますか?

+ (void)unloadClassDefinitionB)クラス定義がメモリから消去されるときに呼び出されるなどのクラス メソッドはありますか? (それも起こりますか?)

4

2 に答える 2

6

リークは、すべてのポインタを失ったメモリのチャンクです。変数はプロセスの期間中存在するため、常にこのオブジェクトへのポインターがあります。古いオブジェクトを破棄せずに新しいオブジェクトをこのポインターに再割り当てしない限り、リークは発生しません。

A) プロセスが終了すると、プロセスのすべてのメモリが再利用されます。アプリケーションの終了後も続く可能性があるリークなどというものはありません。

B) クラスは、Apple の ObjC ランタイムにロードされるとアンロードされることはありません。

このオブジェクトを破棄できるようにしたい場合は、変数をそのメソッドから移動して、別のメソッドからアクセスできるようにし、次の行に沿って何かを行う必要があります。

static MyClass * inst;
+ (MyClass *)sharedInstance
{
    if (!inst)
        inst = [MyClass new];
    return inst;
}

// Under ARC; under MRR you might monkey around with retain and release
// This won't actually immediately destroy the instance if there are other
// strong references to it.
+ (void)destroySharedInstance
{
    inst = nil;
}

ただし、一般的に、シングルトンを使用している場合は、アプリケーションの存続期間中はそれを使いたいと思うでしょう。

于 2013-02-11T02:45:49.317 に答える
1

メモリへの参照(静的なもの)がまだあるため、技術的にはリークを構成しません。inst = nil を設定するまで、メモリは要求されたままになります。ベスト プラクティスは、オブジェクトの使用が終了したことがわかっているときに行うことです。

于 2013-02-11T02:46:44.373 に答える