当我创建自定义类时,我希望能够在构建类的实例后跳过代码的alloc init部分。与它的完成方式类似:
NSString * ex = [NSString stringWithFormat...];
基本上我已经使用自定义初始化方法设置了类来设置我的基本变量。然而,当我在前端并实际制作这些小动物时,我不得不说:
[[Monster alloc] initWithAttack:50 andDefense:45];
我宁愿能说
[Monster monsterWithAttack:50 andDefense:45];
我知道删除alloc部分是一个简单的愚蠢的事情,但它使代码更具可读性,所以我更喜欢这样做。我最初尝试从
更改我的方法-(id)initWithAttack:(int) a andDefense:(int) d
到
-(id)monsterWithAttack:(int) a andDefense:(int) d
然后将我的self = [super init]
更改为self = [[super alloc] init];
,但这显然不起作用!有什么想法吗?
答案 0 :(得分:6)
您必须制作类方法
+(id)monsterWithAttack:(int) a andDefense:(int) d
您可以在其中创建,初始化和返回实例(并且不要忘记您的内存管理):
+(id)monsterWithAttack:(int) a andDefense:(int) d {
// Drop the autorelease IF you're using ARC
return [[[Monster alloc] initWithAttack:a andDefense:d] autorelease];
}
答案 1 :(得分:6)
你想要的是一个方便的构造函数。它是一个类方法,它返回一个可用的类实例并同时为它分配内存。
-(id)initWithAttack:(int)a andDefense:(int)d;
+(id)monsterWithAttack:(int)a andDefense:(int)d;
+(id)monsterWithAttack:(int)a andDefense:(int)d {
//-autorelease under MRC
return [[[self class] alloc] initWithAttack:a andDefense:d];
}
-(id)initWithAttack:(int)a andDefense:(int)d {
self = [super init];
if (self){
//custom initialization
}
return self;
}
答案 2 :(得分:3)
你应该在怪物类的标题中使用类工厂方法。
+(id)monsterWithAttack:(int) attackValue andDefense:(int) defenseValue
实施怪物类
+(id)monsterWithAttack:(int) attackValue andDefense:(int) defenseValue {
return [[[[self class] alloc] initWithAttack:attackValue andDefense:defenseValue] autorelease];
}
[self class]
的使用保证了子类化期间的正确分派。如果您使用ARC,则可以避免使用autorelease
方法
答案 3 :(得分:2)
此类类方法使用autorelease
。
例如,您可能会说:
+ (id)
monsterWithAttack:(int) a
defense:(int) d
{
return [[Monster alloc] initWithAttack:a defense:d]
autorelease];
}