添加一个自定义的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; }