了解“自我”的含义

时间:2012-01-21 17:37:40

标签: objective-c xcode oop

我很难理解特定代码是如何工作的,所以我继续添加了行

NSLog(@"%@ - %@", [self class], NSStringFromSelector(_cmd));

在每个方法的开头,希望我能够看到调用各种方法的确切顺序及其类名。

但是,有时[self class]返回实际不存在该方法的类的名称。例如,它在调试控制台中显示以下内容 - PhotographersTableViewController - shouldAutorotateToInterfaceOrientation:,而方法shouldAutorotateToInterfaceOrientation实际上存在于CoreDataTableViewController

这怎么可能发生?

P.S。另外,Xcode中有没有办法在文件的所有方法中添加一行?

3 个答案:

答案 0 :(得分:4)

这是由于继承,这是Obj-C和大多数面向对象编程语言工作方式的基础。对细节进行着色,这就是它的工作原理:

您的代码中很可能会声明:

@interface PhotographersTableViewController : CoreDataTableViewController { ... }

这声明PhotographersTableViewController作为CoreDataTableViewController的扩展 - PhotographersTableViewController被称为继承 CoreDataTableViewController的方法。

当您进行方法调用时:

PhotographersTableViewController *myPhotoView;
...
[myPhotoView shouldAutorotateToInterfaceOrientation];

然后Obj-C首先在类shouldAutorotateToInterfaceOrientation中查找失败的方法PhotographersTableViewController,然后在成功的类CoreDataTableViewController中查找 - 因此它调用{CoreDataTableViewController中定义的方法1}}传递当前对象,即变量myPhotoView引用的那个,因为self参数的值(self只是一个参数到Obj-C自动提供的方法。

这个过程基础继承和Obj-C。

因此,当您打印出self的值时,您会看到原始对象类型。

上面的细节很多,非常重要:没有提及实例变量,隐藏,范围等等。如果你正在学习Obj-C和面向对象的编程,你需要找一本好书并阅读细节。

答案 1 :(得分:0)

如果PhotographersTableViewController扩展了CoreDataTableViewController,那么self就是PhotographersTableViewController,即使该方法存在于CoreDataTableViewController中。

答案 2 :(得分:0)

Self是一个正在访问当前方法的实例..对于另一个问题..我不认为有这样的选项在每个方法中放置某些行...你可以尝试代码片段