Objective-C中的自定义对象初始化

dar*_*sky 7 iphone cocoa-touch objective-c ipad

我在Objective-C中创建了一个自定义对象.现在我想创建一个自定义初始化程序.该对象有两个属性,名称和分数.所以我的初始化程序如下:

- (id)initWithName:(NSString *)playerName {

    if ((self = [super init])) {
        self.name = [playerName retain];
        self.score = [NSNumber numberWithInt:0];
    }

    return self;
}
Run Code Online (Sandbox Code Playgroud)

retain在这里使用得当吗?或者我可以做到这样self.name = playerName;吗?

此外,假设我想要另一个初始化程序,但保留initWithName:playerName指定的初始化程序.如何让第二个初始化程序调用第一个?

对于最后一个问题,我知道我也需要覆盖这个- (id)init方法.但是,我该怎么办?只是分配测试属性,init只有类被初始化?

谢谢!

Jer*_*myP 7

我在这里使用保留吗?

不,你不是.你应该使用

self.name = playerName;
Run Code Online (Sandbox Code Playgroud)

正如你的建议,或(根据Apple推荐)

name = [playerName copy];
Run Code Online (Sandbox Code Playgroud)

建议不要使用访问器,-init因为子类可能会覆盖它们.

另请注意,作为NSString实现,NSCopying您应该使用copy属性,而不是retain属性.

此外,假设我想要另一个初始化器,但保持initWithName:playerName为指定的初始化器.如何让第二个初始化程序调用第一个?

使用-init作为示例(因为如果指定的初始化程序不相同,则必须覆盖超类的指定初始化程序)

-(id) init
{
    return [self initWithName: @"Some default value"];
}
Run Code Online (Sandbox Code Playgroud)

  • @Nayefc:`@property(copy)NSString*`适用于`NSString`属性(`nonatomic`当然是可选的).你仍然需要在`dealloc`中释放它,因为你拥有用`copy`获得的对象. (2认同)