1

我有一个关于与内存管理重叠的初始化程序的问题。我相信这是一个功能完善的初始化程序(即使它在不鼓励的 init 方法中调用 setter)。. .

@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;

}

但是这个初始化器呢?我需要为这些 ivars 分配内存还是像这样开箱即用?

- (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. 编译器将警告条件中的赋值,使用两行
  3. 通常的做法是直接在 init 中设置 ivars,而不是指 self*
  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 回答