1

メモリ管理と重複する初期化子について質問があります。これは完全に機能するイニシャライザーであると確信しています(初期化メソッドでセッターを呼び出す場合でも、推奨されていません)。。。

@synthesize age = _age, name = _name, delegate = _delegate;

- (id)initWithName:(NSString *)name Age:(int)age delegate:(MyDelegateClass *)delegate
{
    if (self = [super init]) {

        [self setName:name];
        [self setAge:age];
        [self setDelegate:delegate];
     }

  return self;

}

しかし、この初期化子はどうですか?それらのivarにメモリを割り当てる必要がありますか、それともこのように箱から出してすぐに機能しますか?

- (id)initWithName:(NSString *)name Age:(int)age delegate:(MyDelegateClass *)delegate
{
    if (self = [super init]) {

        _name = name;
        _age = age;
        _delegate = delegate;
     }

  return self;

}
4

2 に答える 2

1

いくつかのこと:

  1. (void) 戻り型は機能しません。作ります (id)
  2. コンパイラは条件付きの代入について警告します。2 行を使用します。
  3. self を参照するのではなく、init で ivar を直接設定するのが一般的です*
  4. どちらのフォームも、メモリの割り当てを提案していません。これは、オブジェクトが割り当てられるときに行われます。

それで ...

- (id)initWithName:(NSString *)name age:(int)age delegate:(MyDelegateClass *)delegate {

    self = [super init];
    if (self) {
        _name = name;
        _age = age;
        _delegate = delegate;
    }
    return self;
}
于 2012-10-04T06:15:02.970 に答える
1

通常、文字列を代入するのではなく、コピーする必要がnameありNSString*ますNSMutableString。だからこれをしてください:

_name = [name copy];
于 2012-10-04T07:28:06.923 に答える