在Objective-C描述方法中不能有描述名称的ivar吗?

时间:2010-12-16 20:06:06

标签: objective-c

我正在尝试为我的NSObject派生对象实现Objective-C描述方法。

但是,我的派生对象有一个名称描述的ivar。由于某种原因,这导致了崩溃。

- (NSString *) description {

    NSMutableString *output = [NSMutableString string];
    [output appendFormat:@"MyObject.description = %@\n", self.description];

    return output;
}

为什么会出现这个问题?

2 个答案:

答案 0 :(得分:5)

简答: 崩溃是堆栈溢出的结果,因为您的-description方法会反复调用自身。要做你想做的事情(从描述方法中访问ivar),你应该在ivar前面使用前缀self.

更多详情:

在Objective-C中,self.description[self description]的简写。使用dot-syntax通知编译器您要访问名为description的属性, ivar本身。

答案 1 :(得分:1)

这是一个问题,因为你正在创建一个无限循环。 self.description会调用[自我描述],这正是您所处的方法。因此,您可以重复调用自己的方法。

- (NSString *) description {

    NSMutableString *output = [NSMutableString string];
    [output appendFormat:@"super's description = %@\n", [super description]];
    [output appendFormat:@"MyObject.description = %@\n", description];

    return output;
}

您可以直接访问实例变量,而不是使用self.description。另外,我添加了一行,以显示如何调用super的描述方法(不会创建无限循环)。