添加一个自定义的initWith?

如果我为对象创build一个自定义的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); } 

加里

您可以创build一个指定的初始化程序,该初始化程序接受要在初始化中使用的所有参数。

然后你从其他的-(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:并且从其他初始化程序调用它。

如果你想扩展这个类,你可以从子类调用你指定的初始化器。

我build议创build一个主要的初始化,处理大部分的工作。 然后你可以创build任何数量的其他初始化函数,这些初始化函数都被称为主函数 这样做的好处是如果你想改变初始化过程,你只需要改变一个点(通常)。 它可能看起来像这样:

 -(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)只是简单地调用initWithX:一个默认值(在这个例子中是0)。

是的,我就是这么做的。 一个微小的变化将会删除一行代码:

  if (self = [super init]) { 

而不是:

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

对于现代的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:@""]; } 

有时候,你想重新使用一些初始化代码,只对特定的初始化者略微修改行为。 在这种情况下,我执行以下操作:

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