it-swarm-ja.tech

カスタムのinitWithを追加しますか?

オブジェクトのカスタムinitWithを作成する場合、initをオーバーライドする必要がある場合、追加するコードを本質的に含めますか?

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

例えば.

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

ゲイリー

44
fuzzygoat

初期化で使用可能にするすべてのパラメーターを受け入れる1つの指定初期化子を作成できます。

次に、他の-(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:であり、他の初期化子から呼び出します。

このクラスを拡張する場合は、サブクラスから指定された初期化子を呼び出します。

89
stefanB

ほとんどの作業を処理する1つのメインイニシャライザーを作成することをお勧めします。その後、このメインをすべて呼び出す他のイニシャライザーをいくつでも作成できます。これの利点は、初期化プロセスを変更する場合、1つのスポットを変更するだけで済むことです。次のようになります。

-(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:を呼び出すだけです。

9
dbachrach

はい、それはまさに私がそれを行う方法です。わずかな変更により、コードが1行削除されます。

 if (self = [super init]) {

とは対照的に:

 self = [super init];
 if(self) {
6
Benjamin Cox

現代の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:@""];
}
5
ohho

場合によっては、一部の初期化コードを再利用して、特定の初期化子の動作をわずかに変更したいことがあります。この場合、次のことを行います。


- (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;
}

2
dreamlax