添加自定义initWith?

时间:2009-11-10 21:12:36

标签: objective-c

如果我为一个对象创建一个自定义initWith,我是否应该包含我想要覆盖init的代码?

-(id) init {
    self = [super init];
    if (self) {
        NSLog(@"_init: %@", self);
    }
    return(self);
}

e.g。

-(id) initWithX:(int) inPosX andY:(int) inPosY {
    self = [super init];
    if(self) {
        NSLog(@"_init: %@", self);
        posX = inPosX;
        posY = inPosY;
    }
    return(self);
}

加里

5 个答案:

答案 0 :(得分:88)

您可以创建一个指定的初始化程序,它接受您希望在初始化时可用的所有参数。

然后您使用适当的参数从您的另一个-(id)init指定的初始化程序中调用。

只有指定的初始化程序才会初始化超类[super init]

示例:

- (id)init
{
    return [self initWithX:defaultX andY:defaultY];
}

- (id)initWithPosition:(NSPoint)position
{
    return [self initWithX:position.x andY:position.y];
}


- (id)initWithX:(int)inPosX andY:(int)inPosY
{
    self = [super init];
    if(self) {
        NSLog(@"_init: %@", self);
        posX = inPosX;
        posY = inPosY;
    }
    return self;
}

指定的初始值设定项为-(id)initWithX:andY:,您可以从其他初始值设定项中调用它。

如果您想扩展此类,可以从子类调用指定的初始值设定项。

答案 1 :(得分:9)

我建议创建一个主要初始化程序来处理大部分工作。然后,您可以创建任意数量的其他初始值设定项,这些初始值设这样做的好处是,如果您想要更改初始化过程,您只需要更改一个位置。它可能看起来像这样:

-(id) initWithX:(float)x {
    if (self = [super init]) {
        /* do most of initialization */
        self.xVal = x;
    }
    return self;
}

-(id) init {
    return [self initWithX:0.0f];
}

在这个例子中,initWithX:是我们的主要初始化器。另一个初始化程序(init)只使用默认值(在本例中为0)调用initWithX:。

答案 2 :(得分:6)

是的,我正是这样做的。稍微改变就会删除一行代码:

 if (self = [super init]) {

相反:

 self = [super init];
 if(self) {

答案 3 :(得分:5)

modern Objective-C ...

UDFile.h

#import <Foundation/Foundation.h>

@interface UDFile : NSObject

@property (nonatomic, strong) NSString *name;

- (instancetype)initWithName:(NSString *)name NS_DESIGNATED_INITIALIZER;

@end

UDFile.m

#import "UDFile.h"

@implementation UDFile

- (instancetype)initWithName:(NSString *)name {
    self = [super init];
    if (self) {
        _name = [name copy];
    }
    return self;
}

- (instancetype)init {
    return [self initWithPathname:@""];
}

答案 4 :(得分:2)

有时,您希望重用某些初始化代码,并仅针对特定初始化程序稍微修改行为。在这种情况下,我会执行以下操作:


- (id) init
{
    self = [super init];
    if (!self) return nil;

    // These values are always initialised this way
    ivar1 = 10;
    ivar2 = @"HellO";
    ivar3 = [[NSMutableArray alloc] initWithCapacity:10];
    ivar4 = 22;

    return self;
}

- (id) initWithIvar4:(int) aValue
{
    // call -init on self, which will call -init on super for us, and set
    // up ivar1, ivar2, ivar3, and ivar4.
    self = [self init];
    if (!self) return nil;

    // Change ivar4 from the default 22 to whatever aValue is.
    ivar4 = aValue;

    return self;
}