Objective C没有init的构造函数

时间:2012-07-07 22:05:22

标签: objective-c ios initialization

当我创建自定义类时,我希望能够在构建类的实例后跳过代码的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];,但这显然不起作用!有什么想法吗?

4 个答案:

答案 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];
}