如果我为一个对象创建一个自定义initWith,我实际上是否包含我想要覆盖init的代码?
-(id) init {
self = [super init];
if (self) {
NSLog(@"_init: %@", self);
}
return(self);
}
Run Code Online (Sandbox Code Playgroud)
例如
-(id) initWithX:(int) inPosX andY:(int) inPosY {
self = [super init];
if(self) {
NSLog(@"_init: %@", self);
posX = inPosX;
posY = inPosY;
}
return(self);
}
Run Code Online (Sandbox Code Playgroud)
加里
ste*_*anB 91
您可以创建一个指定的初始化程序,它接受您希望在初始化时可用的所有参数.
然后-(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;
}
Run Code Online (Sandbox Code Playgroud)
指定的初始化程序是-(id)initWithX:andY:您从其他初始化程序调用它.
如果您想扩展此类,请从子类调用指定的初始化程序.
小智 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];
}
Run Code Online (Sandbox Code Playgroud)
在这个例子中,initWithX:是我们的主要初始化器.另一个初始化程序(init)只使用默认值(在本例中为0)调用initWithX:.
是的,这正是我做的.一个小小的改变将删除一行代码:
if (self = [super init]) {
Run Code Online (Sandbox Code Playgroud)
相反:
self = [super init];
if(self) {
Run Code Online (Sandbox Code Playgroud)
对于现代Objective-C ......
UDFile.h
#import <Foundation/Foundation.h>
@interface UDFile : NSObject
@property (nonatomic, strong) NSString *name;
- (instancetype)initWithName:(NSString *)name NS_DESIGNATED_INITIALIZER;
@end
Run Code Online (Sandbox Code Playgroud)
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:@""];
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
47615 次 |
| 最近记录: |