1

所以,我刚开始学习Objective-C,就遇到了这个“自我”的东西。我只使用过 C,但我认为它也可能在 java 中使用过?有人可以解释吗?这是一个例子:

- (IBAction)digitPressed:(UIButton *)sender
{
    NSString *digit = [sender currentTitle];
    UILabel *myDisplay = [self display];  //why this?
}

为什么不只是这个?

- (IBAction)digitPressed:(UIButton *)sender
{
        NSString *digit = [sender currentTitle];
        UILabel *myDisplay = display;  //why not like this?
}

显示是一个 UILabel *

4

5 回答 5

3

[self display], 或self.display, 指的是属性/方法(属性只是 get/set 方法的快捷方式),如果您在 .h 文件中有类似的内容

@property (weak, nonatomic) UILabel* display;

或者

-(UILabel*)display;

只是display,或self->display指的是一个实例变量。当您声明了这样的实例 var 时,这是有效的:

@implementation MyClass {
    UILabel* display;
}

如果您display在 .h 文件中声明了属性并且没有更改其默认值,则相应的实例 var 将为_display(注意下划线),在这种情况下,以下内容将相同: self.displayself->_display

于 2013-06-21T01:59:33.930 回答
1

在这种情况下,这是一个客观的 C 消息传递。当您看到括号时,它正在执行此操作:

[Object Message]

基本上 self 是对象, display 是您发送的消息。向它发送消息类似于另一种语言的方法调用,但在底层略有不同。所以是这样的:

[self doSomethingCool];

在目标 C 中会翻译成另一种语言的类似内容:

this.doSomethingCool();

当然,如果在另一个对象上运行方法,您将用该对象替换 self ,例如:

[myObject doSomethingCool];

在许多语言中,您实际上并不需要在方法调用前面有“this”,这暗示如果您不包含它,您正在使用的对象中运行该方法。当我开始做类似的事情时,我很早就被烧伤了。我调用了一个数据层方法,你可以在其中保存一个对象,它会给你一个整数。当我保存对象时,我没有将 self 放在方法调用的前面,它实际上是在生成一个新对象并保存它,我没有得到正确的整数。

使用“self”只是明确告诉它“我正在使用这个对象”。与属性相同,我总是使用“self.MyProperty”而不是“MyProperty”,因为我想要明确并确保我正在使用我正在使用的对象的 MyProperty。这样的缺陷很少见打你,你希望使用某个对象,而环境认为你正在使用另一个对象,但是当你遇到一个对象时,它会让人头疼,因为一切看起来都正确。

于 2013-06-21T02:25:15.793 回答
0

单词self指的是当前对象,在这种情况下是您的视图控制器实例,并将它与方法名称结合起来display,意味着您正在将消息display发送给self,即视图控制器。这将调用在视图控制器实例中声明的方法display 。

您可以在视图控制器中声明显示方法,例如:

- (UILabel)display 
{
    //your display method implementation returning UILabel instance
}

对于第二个,这意味着您指的是显示变量。例如:

UILabel *display = [[UILabel alloc] init];
于 2013-06-21T00:49:48.900 回答
0

display不是UILabel *- 它可能是具有该类型的属性,或者是返回该类型值的方法,但这些是完全不同的东西。

您需要阅读有关面向对象编程的内容。selfObjective-C 中的 是当前对象引用,其他 OO 语言调用它this- Java 和 C++ 都使用该名称。理解对象和方法是使用任何这些语言的基础。

于 2013-06-21T00:52:21.657 回答
0

这里有一个很好的解释:http: //useyourloaf.com/blog/2011/02/08/understanding-your-objective-c-self.html

您问题的关键部分是关于 Objective-C 2.0 点语法的部分:

Objective-C 点语法

点语法是在 Objective-C 2.0 中引入的,并引起了很多争论。许多经验丰富的长期 Cocoa 程序员建议完全避免使用它。Chris Hanson 等其他人对何时使用属性和点表示法有不同的看法。无论你站在哪一边,我想最重要的是要保持一致。

无论如何,要了解点语法的主要内容是以下两个语句正在做同样的事情:

self.timestamp = [NSDate date];
[self setTimestamp:[NSDate date]];

点只是更传统的 Objective-C 方法调用的快捷方式。每当您看到一个点时,您都​​可以将其替换为等效的方括号方法调用语法。然而,重要的是要理解这与编写以下内容不同:

时间戳 = [NSDate 日期]; 如果没有 self 对象和点,我们不再向对象发送消息,而是直接访问名为 timestamp 的 ivar。由于这绕过了 setter 方法,我们将覆盖时间戳 ivar,而无需首先释放旧的 NSDate 对象。我们也不会保留我们分配的新对象。这两种情况都不好!

请记住,这些示例是在没有使用 ARC 的情况下编写的,因此有很多关于内存管理、保留、释放等的参考。但是,查看这些示例很有用,以便您了解 ARC 在后台所做的事情。

在您的示例中,您不是指实际的显示属性,[self display]实际上是指“self”对象的实例方法,在这种情况下是您的 UIViewController。

于 2013-06-21T01:00:12.053 回答