【问题标题】:Understanding what exactly 'self' means了解“自我”的确切含义
【发布时间】:2012-01-21 17:37:40
【问题描述】:

我很难理解特定代码的工作原理,所以我继续添加了这一行

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

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

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

怎么会这样?

附:另外,Xcode有没有办法在文件的所有方法中添加一行?

【问题讨论】:

    标签: objective-c xcode oop


    【解决方案1】:

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

    您的代码中很可能有如下声明:

    @interface PhotographersTableViewController : CoreDataTableViewController { ... }
    

    这将PhotographersTableViewController 声明为CoreDataTableViewController 的扩展 - 据说PhotographersTableViewController 继承 CoreDataTableViewController 的方法。

    当你调用一个方法时:

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

    然后Obj-C首先在PhotographersTableViewController类中寻找方法shouldAutorotateToInterfaceOrientation,但失败了,然后在CoreDataTableViewController类中寻找方法,它成功了——所以它调用CoreDataTableViewController中定义的方法传递给它当前对象,即变量myPhotoView引用的对象,作为self参数的值(self只是Obj-C自动提供的方法的一个参数)。

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

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

    上面掩盖了很多细节,其中很多非常重要:没有提及实例变量、隐藏、作用域等。如果你正在学习 Obj-C 和面向对象编程,你需要找一本好书,阅读详细信息。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        Self 是一个正在访问当前方法的实例.. 而对于其他问题.. 我认为没有这样的选项可以在每个方法中放置特定的行...不过您可以尝试使用代码 sn-ps

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-06-02
          • 2011-06-30
          • 1970-01-01
          • 2019-05-12
          • 2021-06-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多