为什么要使用“自我”,这是什么意思?

时间:2013-06-21 00:43:18

标签: ios objective-c cocoa-touch self

所以,我刚开始学习Objective-C而且我已经遇到过这个" self"事情。我只使用过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 *

5 个答案:

答案 0 :(得分:3)

[self display]self.display是指属性 / 方法(属性只是get / set方法的快捷方式),如果你在.h文件中有这样的东西

@property (weak, nonatomic) UILabel* display;

-(UILabel*)display;

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

@implementation MyClass {
    UILabel* display;
}

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

答案 1 :(得分:1)

在这种情况下,它是一个客观的C消息传递。当你看到括号时它正在这样做:

[Object Message]

基本上,self是对象,显示是您发送它的消息。发送消息就像用另一种语言调用方法一样,但在引擎盖下有点不同。所以像这样:

[self doSomethingCool];
目标C中的

将转换为另一种语言中的类似内容:

this.doSomethingCool();

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

[myObject doSomethingCool];

在很多语言中,你真的不需要在方法调用前面加上“this”,这意味着如果你不包含它,你就会在你工作的对象中运行该方法用。当我开始使用类似的东西时,我很早就被烧了。我有一个数据层方法的调用,你可以保存一个对象,它会给你一个整数。当我保存对象时,我没有把自己放在方法调用的前面,它本质上是生成一个新对象并保存它,而我没有得到正确的整数。

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

答案 2 :(得分:0)

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

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

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

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

UILabel *display = [[UILabel alloc] init];

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

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

  

Objective-C Dot语法

     

使用Objective-C 2.0引入点语法并生成很多内容   辩论。一些有经验和长期的Cocoa程序员   建议完全避免它。其他如克里斯汉森有一个   关于何时使用属性和点符号的不同视图。   无论你堕落的哪一方,我猜主要的是   保持一致。

     

无论如何,要理解点语法的主要原因是   以下两个陈述正在做同样的事情:

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

点只是更传统的Objective-C方法的捷径   呼叫。任何时候你看到一个点,你可以用等效的替换它   方括号方法调用语法。重要的是要理解   但是,这与编写以下内容不同:

     

timestamp = [NSDate date];没有自我对象和点我们   不再向对象发送消息,而是直接访问ivar   命名时间戳。因为这会绕过我们的setter方法   在没有首先释放旧的NSDate的情况下覆盖时间戳ivar   宾语。我们也不会保留我们分配的新对象。   这两种情况都很糟糕!

请记住,这些示例是在不使用ARC的情况下编写的,因此有很多对内存管理,保留,发布等的引用。但是,查看这些示例是有用的,这样您就可以了解ARC正在做什么。背景。

在您的示例中,您没有引用[self display]的实际显示属性,实际上您指的是“self”对象的实例方法,在本例中是您的UIViewController。