如果我为一个对象创建一个自定义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);
}
加里
答案 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)
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;
}