我很难理解特定代码是如何工作的,所以我继续添加了行
NSLog(@"%@ - %@", [self class], NSStringFromSelector(_cmd));
在每个方法的开头,希望我能够看到调用各种方法的确切顺序及其类名。
但是,有时[self class]
返回实际不存在该方法的类的名称。例如,它在调试控制台中显示以下内容 -
PhotographersTableViewController - shouldAutorotateToInterfaceOrientation:,而方法shouldAutorotateToInterfaceOrientation
实际上存在于CoreDataTableViewController
。
这怎么可能发生?
P.S。另外,Xcode中有没有办法在文件的所有方法中添加一行?
答案 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是一个正在访问当前方法的实例..对于另一个问题..我不认为有这样的选项在每个方法中放置某些行...你可以尝试代码片段