-2

こんにちは、初めてObjective-cです。インスタンス変数と保持プロパティのメモリを解放する方法を教えてください。ここで、保持されたプロパティを解放したいと思います。プロパティをリリースしますか?

  @interface VAViewController ()
  @property(nonatomic, retain)NSMutableDictionary *starDict;
  @end
  @implementation VAViewController
  @synthesize starDict = _starDict;

  -(void)setDictName
  {
     [self.starDict setValue:@"maddt" forKey:@"dictName"];
  }
  -(void)dealloc
  {
     [_starDict release];
     [super dealloc];
  }
  - (void)viewDidLoad
  {
      [super viewDidLoad];
      _starDict = [[NSMutableDictionary alloc]init];

      [self setDictName];
  }
 @end
4

4 に答える 4

1

あなたの質問に答えるには:

ここで、保持されたプロパティを解放したいと思います。プロパティをリリースしますか?

self.starDictこれは ivar にアクセスする便利な方法であり、個別のオブジェクトではないことに注意してください。実際には、プロパティは、いくつかのストレージ (ivar) に関連付けられた 2 つのセッター メソッドとゲッター メソッドにすぎません。

ivar を放せば完了です。プロパティを nil に設定すると、ivar も解放され (そして nil に設定され)、すべて同じことが行われます。

別の観点から、次のケースを考えてみましょう。

1.    [_starDict release]; _starDict = nil;

2.    self.starDict = nil;

それらはまったく同じであるため (プロパティが として宣言されているretain場合)、どちらかを実行します。もちろん両方を実行できますが、1 または 2 のいずれかを実行すると ivar/property が niling されるため、他の操作を実行してもまったく効果がありません。

(ところで、よりコンパクトで読みやすいので、私はプロパティを niling することを好みます。)

お役に立てれば。

編集:

繰り返しますが、プロパティベースの構文を使用してリリースを行うメリットについて、 で行うことを検討してくださいviewDidLoad

- (void)viewDidLoad
{
  [super viewDidLoad];
  _starDict = [[NSMutableDictionary alloc]init];

  [self setDictName];
}

これで、 が 2 回呼び出された場合にメモリ リークが発生viewDidLoadします (これは、呼び出し後に古いバージョンの iOS SDK で発生する可能性がありviewDidUnloadます)。

したがって、ivar に再​​度割り当てる前に、常にオブジェクトを解放する必要があります。

[_starDict release]; _starDict = [[NSMutableDictionary alloc]init];

また:

self.starDict = [[[NSMutableDictionary alloc]init] autorelease];
于 2013-10-07T12:11:06.740 に答える
1

init メソッドで変更します:

_name = [@"" retain];

_name = @"";

ただし、ARC は iOS 5 で表示され、現在は iOS 7 です。Objective-C を初めて使用する場合は、Apple がオブジェクトをより適切にリリースするため、ARC を使用してください。

于 2013-10-07T11:36:04.840 に答える
0

はい、プロパティを解放する必要があります。より良い方法は、解放されたオブジェクトを nil に設定することです。

- (void) dealloc
{
    [_object release], _object = nil
    [super dealloc];
}

プロパティを解放したい場合は、単に使用できます

- (void) dealloc
{
    self.object = nil;
    [super dealloc];
}
于 2013-10-07T11:43:24.197 に答える