所以,我刚开始学习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 *
答案 0 :(得分:3)
[self display]
或self.display
是指属性 / 方法(属性只是get / set方法的快捷方式),如果你在.h文件中有这样的东西
@property (weak, nonatomic) UILabel* display;
或
-(UILabel*)display;
仅display
或self->display
指的是实例变量。当您声明了这样的实例var时,这是有效的:
@implementation MyClass {
UILabel* display;
}
如果您在.h文件中声明了属性display
并且未更改其默认值,则相应的实例var将为_display
(注意下划线),在这种情况下,以下内容将是相同的:
self.display
和self->_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。