2012-01-21 66 views
0

我有一个很难理解一个特定的代码是如何工作的,所以我说干就干,在希望,我会加入行了解究竟是什么“自我”的意思

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

在每个方法的开始能够看到各种方法与其类名一起被调用的确切顺序。

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

这是怎么发生的?

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

回答

0

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

0

自己是一个正在访问当前方法的实例..对于其他问题..我不认为有这样的选项可以在每种方法中放置某一行...您可以尝试代码片段,尽管

4

这是由于继承,这是Obj-C和大多数面向对象编程语言的工作方式的基础。粉饰的细节,这是它如何工作的:

在所有的可能性,你在你的代码就像有一个声明:

@interface PhotographersTableViewController : CoreDataTableViewController { ... } 

这声明PhotographersTableViewControllerCoreDataTableViewController的延伸 - PhotographersTableViewController就是继承的说方法CoreDataTableViewController

当你一个方法调用:

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

然后对象 - 首先查找方法shouldAutorotateToInterfaceOrientationPhotographersTableViewController类,它失败,然后在CoreDataTableViewController类,它成功 - 那么它会调用定义的方法CoreDataTableViewController当前对象(即变量myPhotoView所引用的那个)作为参数self的值(self仅仅是由Obj-C自动提供的方法的参数)传递给它。

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

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

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

相关问题