0

当我创建自定义类时,我希望能够在构建类的实例后跳过代码的 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

4 回答 4

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];
}
于 2012-07-07T22:08:40.520 回答
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;
    }
于 2012-07-07T22:12:08.417 回答
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方法

于 2012-07-07T22:14:04.353 回答
2

这种类型的类方法使用autorelease.

例如,你可能会说:

+ (id)
monsterWithAttack:(int)  a
defense:(int)            d
{
    return [[Monster alloc] initWithAttack:a defense:d]
            autorelease];
}
于 2012-07-07T22:11:27.663 回答