0

一定期間現在の状態を維持する必要があるインスタンス変数のメモリを管理する方法を理解するのに苦労しています。その後、新しく割り当てられたメモリに再割り当てされます。

インスタンス変数「importantData」の次の例を見てください。

-(void)Update
{
   importantData = [[self getObject] retain];
}


- (SomeObject *)getObject 
{
   SomeObject *objInstance = [[SomeObject alloc] init];
   [objInstance autorelease];  
   return objInstance;
}       

私の実際のプロジェクトでは、getObject プロシージャは別のクラスにありますが、要点を理解するために単純化しました。importantData は、Update の呼び出し間で有効である必要があります。

getObject が呼び出されるたびに、新しいメモリを割り当てて重要なデータに割り当てていますよね? 重要なデータが以前に指していたメモリを解放する必要があると思いますよね?メモリをリークしたり、割り当て解除されたメモリを参照しようとしたりせずに、これを適切に行う方法がわかりません。ありがとう!

4

2 に答える 2

2

次のように更新するだけです。

-(void)Update
{
   [importantData release];
   importantData = [[self getObject] retain];
}

基本的に、新しい値を割り当てる前にリリースすることを忘れないでください。

于 2010-02-10T05:48:34.660 に答える
1

静的変数を使用できます。

static SomeObject *importantObject = nil;

@implementation SomeObject

+ (SomeObject*)getObject {
  if (!importantObject) {
    importantObject = [[SomeObject alloc] init];
  }
  return importantObject;
}

@end

これにより、アプリが存在するまで保持されます。ただし、無効化または再作成する場合は、次のようなメソッドを追加できます。

+ (void)expireObject {
  [importantObject release];
  importantObject = nil;
}

あるいは

+ (void)setObject:(SomeObject*)newObject {
  [importantObject release];
  importantObject = [newObject retain];
}

またimportantObject、 inのクラス メソッドとインスタンス メソッドを使用したり、のクラス メソッド getterSomeObjectを介して他のクラスから取得したりできます。SomeObject

于 2010-02-10T05:03:59.213 に答える