0

オブジェクトを解放して再度インスタンス化する最も安全な方法は何だろうと思っています。

私がやっていることはこれであり、うまくいくようですが、これがメモリリークを引き起こしていないかどうかはわかりませんか?

- (void)reLoadCalendarObject
{
if (self.calViewController != nil)
    self.calViewController = nil;   //release instantiated object

CalViewController *tempCalViewController = [[CalViewController alloc]initWithDate:[NSDate dateWithTimeIntervalSinceNow:0.0f] observer:self];
self.calViewController = tempCalViewController;
[tempCalViewController release];
self.calViewController.dataSource = self.calendarDataSource;
}

self.calViewControllerプロパティは次のように宣言されます(nonatomic,retain)

4

2 に答える 2

1

を使用する@property (nonatomic, retain) MyObject *myObject;@synthesize myObject = _myObject;、コンパイラがゲッターとセッターを生成します。セッターは次のように動作します(必ずしもこのように実装されるとは限りません)。

1| - (void)setMyObject:(MyObject *)myObject;
2| {
3|     if (_myObject != myObject) {
4|         [_myObject release];
5|         _myObject = [myObject retain];
6|     }
7| }

3行目で、設定しているオブジェクトが渡されたオブジェクトと同じではないことを確認するためのチェックを行います (正確に同じオブジェクトであることを確認しているため、ポインターを確認します)。

4行目で、異なるオブジェクトがあることがわかっているので、古い値を解放する必要があります。

5行目で、新しいオブジェクトを保持します。


@thesaadが指摘したようself.calViewController = nil;に、あなたは不要であり、実際には、プロパティがすでに設定されている場合、if (self.calViewController 1= nil)送信(または任意のオブジェクト)が完全に安全であるためです。nil

渡す例では、nilこれが起こります。

3行目nilで、以前に設定されたオブジェクトと同じではないことがわかります

4行目で古いオブジェクトを解放します

5行目で、バッキング ivar を に設定しnilます。呼び出しretainnilノーオペレーションだからそれもいい

于 2012-06-09T15:31:32.170 に答える