Obj-C代码中'self'的功能?

时间:2014-11-26 15:54:47

标签: ios objective-c

我正在阅读斯坦福大学iOS iTunes课程的第二讲,并坚持使用关键字self。它出现在两种不同的方法中,我无法理解self究竟指的是什么 - 以及为什么我们需要包含self

我们已经创建了一个名为的课程,现在正在创建一个名为 Deck 的新课程来管理一系列卡片。我对self方法中self.cards的情况addCard: atTop:的功能特别不确定。我只是不确定为什么使用自我。为什么不推断它是什么意思?

它也出现在第二种方法addCard:中,我再次不确定自己指的是什么。它只是引用addCard:?如果是这样,为什么有必要再回头看看自己呢?

非常感谢任何帮助。

Deck .h File
#import <Foundation/Foundation.h>
#import "Card.h"
@interface Deck : NSObject
- (void)addCard:(Card *)card atTop:(BOOL)atTop;
- (void)addCard:(Card *)card;
- (Card *)drawRandomCard;
@end

Deck .m File
#import "Deck.h"
@interface Deck()
@property (strong, nonatomic) NSMutableArray *cards; // of Card
@end
@implementation Deck
- (NSMutableArray *)cards
{
    return _cards;
}
- (void)addCard:(Card *)card atTop:(BOOL)atTop
{
    if (atTop) {
        [self.cards insertObject:card atIndex:0];
    } else {
        [self.cards addObject:card];
} }
- (void)addCard:(Card *)card
{
    [self addCard:card atTop:NO];
}
- (Card *)drawRandomCard { }
@end

3 个答案:

答案 0 :(得分:3)

在Objective-C中,方法调用的表示法是

[object message:argument]

如果您要向cards发送消息,您需要知道哪个Deck实例需要参考哪个卡片元素。

所以,当你说self.cards时,它说“我想在当前甲板实例中使用卡片元素”。

所以self.cards是Objective-C调用中的“对象”。

答案 1 :(得分:1)

当你有一个像你这样的课程时,你不能在没有对象的情况下调用它的方法。首先,你必须这样做:

Deck* myDeck = [[Deck alloc] init];

稍后,如果你这样做:

[myDeck addCard:myCard atTop:YES];

它在 addCard:onTop:上调用方法myDeck 。在方法的代码中,self现在引用myDeck,允许我们将卡片添加到右侧套牌中。如果您稍后在Deck的其他实例上调用该方法,self将引用该实例。

答案 2 :(得分:0)

摘自维基百科文章:this (computer programming)

  某些计算机编程中使用了

自我 keywords   语言指的是对象,类或其他实体   目前运行代码是其中的一部分。这些实体所指的实体   因此,关键字取决于执行上下文(例如哪个对象)   正在使用它的方法。使用不同的编程语言   这些关键字的方式略有不同。在语言中   像“this”这样的关键字是必需的,关键字是唯一的方法   访问存储在当前对象中的数据和方法。在哪里可选,   他们可以使用相同的名称消除变量和函数的歧义。