0

我正在研究一个SKNode名为的子类UtilityNode

@implementation UtilityNode

- (id)initWithName:(NSString *)rootName {
    self = [super init];
    if(self) {
        [self setName:rootName]; // ?
    }
    return self;
}

@end

我正在为新节点设置一个指定的初始化程序,我在创建新子initWithName:类时尝试初始化超类的名称。SKNode我的印象是我可以写_name = rootName;,但 _name 被标记为未声明。我已经通过使用 Can有人对此有所了解(如您在上面看到的那样)使其正常工作[self setName:rootName];,我这样做是否正确?

4

1 回答 1

4

这是对的。_name实例变量可能被声明为(@private自动合成属性的默认值),因此子类无法访问它。

在精心设计的类层次结构中,特别是没有可用源代码的框架类中,您会发现大多数(如果不是所有)实例变量都无法被子类访问,因为它隐藏了实现细节并使未来对基类的更改成为可能。想象一下,如果基类需要在 name 属性更改时验证它——如果子类可以直接分配给 ivar,它们将绕过添加到 ivar setter 方法的检查。

PS:我发现点符号对眼睛更友好:

 self.name = rootName;

关于“不要self在 init/dealloc 中发送消息”规则的更新:

这可以通过重新设计类以在其 init 方法中不采用非必要参数来轻松避免。这个子类的更简洁的版本是:

UtilityNode* un = [UtilityNode node];
un.name = @"some name";

如果节点绝对需要设置参数,则NSAssert在要求名称有效的方法中通过一个警告用户。

于 2014-03-19T13:20:42.683 回答