【问题标题】:Function of 'self' in Obj-C code? [duplicate]Obj-C代码中“自我”的功能? [复制]
【发布时间】:2014-11-26 15:54:46
【问题描述】:

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

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

它也出现在第二种方法中,addCard: 我再次不确定 self 指的是什么。它只是指 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

【问题讨论】:

  • self = this (C++) or Me(VB)

标签: ios objective-c


【解决方案1】:

在 Objective-C 中,方法调用的符号是

[object message:argument]

如果你想向cards发送消息,你需要知道你想引用哪个卡片元素的Deck实例。

所以当你说 self.cards 时,它会说“我想要当前 Deck 实例中的卡片元素”。

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

【讨论】:

  • 很好的解释。对于不熟悉面向对象编程的人来说,这经常会让你感到困惑。当你写 init 时,你实际上是在创建一个对象的实例。如果您希望该对象执行某些操作,则需要引用该实例。我花了一段时间才弄明白。
  • 在这个课程中你不是一直在使用当前的 Deck 实例吗?为什么需要包含自我?比如为什么不直接写 [cards message:argument]?
  • 如果您在“类方法”中,则不会。这些以“+”而不是“-”开头。另外,如果你在一个 Deck 的函数中,它需要一个 Deck 并复制它。然后你有self.cardsargumentDeck.cards
  • 好的,现在稍微好点。也阅读其他链接的 pgs。感谢您的帮助。
【解决方案2】:

当你有一个像你这样的类时,你不能只调用它的方法而没有对象。首先你必须这样做:

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

稍后,如果你这样做:

[myDeck addCard:myCard atTop:YES];

它调用方法addCard:onTop: on myDeck。在方法的代码中,self 现在引用myDeck,允许我们将卡片添加到正确的牌组。如果您稍后在 Deck 的不同实例上调用该方法,self 将引用该实例。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-23
      • 2013-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多