我正在尝试为我的NSObject派生对象实现Objective-C描述方法。
但是,我的派生对象有一个名称描述的ivar。由于某种原因,这导致了崩溃。
- (NSString *) description {
NSMutableString *output = [NSMutableString string];
[output appendFormat:@"MyObject.description = %@\n", self.description];
return output;
}
为什么会出现这个问题?
答案 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的描述方法(不会创建无限循环)。