【问题标题】:SELF keyword in Objective-CObjective-C 中的 SELF 关键字
【发布时间】:2010-12-31 22:50:48
【问题描述】:

在我正在创建的项目中,我有各种类。我的一个类有一个 NSMutableArray 的实例,它包含我的另一个类的对象。我以为我对这个话题有深刻的理解,但不知怎的,它又在我脑海里乱七八糟了。

在初始化这个类的实例时,我有这个initilize方法:

- (MMShowMovement *) initWithMovementName: (NSString *) name andNumber: (NSInteger) number {

 if( [super init] ) {

  [self setMovementTitle: name];
  [self setMovementNumber: number];

  [self setDotArray: [[NSMutableArray alloc] init]];

 }

 return self;

}

稍后,在创建此类的实例后,我可以将对象添加到 NSMutableArray“dotArray”。这是那个方法。

- (void) addDot: (MMDot *) dot {

 [dotArray addObject: dot]; 

}

(我知道,它很简单)我想知道,当我在此方法中使用“dotArray”时,我正在访问调用此方法的类实例的 dotArray 对象,对吗?还是我也应该在这里使用 self 关键字?

- (void) addDot: (MMDot *) dot {

 [[self dotArray] addObject: dot]; 

}

老实说,我不太确定。我相信是前者,但我不确定为什么。而且在这个方法中也没有必要使用self关键字,为什么要在初始化器中使用它才能访问对象呢?

【问题讨论】:

    标签: objective-c variables methods instance-variables instance-methods


    【解决方案1】:

    self 是指向当前接收者的指针 - 它指的是接收到消息的对象。
    您可以使用 self 来访问执行当前方法的对象。

    在您的情况下,这意味着如果 MMShowMovement 类型的对象 X 收到 addDot: 消息,则 self 包含指向 X 的指针。
    您可以通过三种不同的方式访问dotArray

    [dotArray addObject:dot]; //directly access the instance variable dotArray
    [[self dotArray] addObject:dot]; //access dotArray with an accessor method
    //--or--
    [self.dotArray addObject:dot]; //access dotArray with an accessor method using dot-syntax
    

    如果您使用自动 KVO 通知,则必须使用访问器(而不是直接操作 ivar)来触发通知。
    要确保通过其访问器方法访问变量,您必须添加前缀 self.

    【讨论】:

      【解决方案2】:

      通常我们会写

      self = [super init]  
      

      因为 super 的初始化方法可能会返回一个与分配的对象不同的对象。这就是为什么我们在 initxxx 方法中使用 self 而我们不需要在其他类型的方法中使用 self

      我从《在 Mac 上学习 Objective-C,第 10 章对象初始化,Mark Dalrymple 和 Scott Knaster,Apress 这本书清楚地学到了这些东西。

      本书摘录:
      实例变量位于与隐藏的 self 参数有固定距离的内存位置。如果从 init 方法返回一个新对象,我们需要更新自身,以便任何后续实例变量引用影响内存中的正确位置。

      【讨论】:

      • 这是有道理的。谢谢!我正在重读 Kochan 书的部分内容,试图再次理顺它..
      • 也许您还可以查看权威文档:Apple Developer 网站的 Objective-C 2.0 编程语言,尤其是 Ch3 分配和初始化对象。
      【解决方案3】:

      [self dotArray] 调用对象的“dotArray”选择器(方法)。如果没有这样的方法,你会得到一个错误。你不能通过这种方式访问​​实例变量,除非它是一个属性并且你已经为它合成了这个 getter 方法。

      [dotArray addObject] 只是访问变量并调用由 NSMutableArray 指定的内置方法。

      [self setMovementTitle:]、[self setMovementNumber:]和[self setDotArray:]都是方法调用。方法调用总是需要对象引用。

      在init中,你还不如说[dotArray addObject](当然是在初始化变量之后)。

      【讨论】:

      • 你的意思是他可以在-(id)init中写dotArray = [[NSMutableArray alloc] init]
      • swegi: 是的,也许吧,虽然 setDotArray 也可能做其他事情。
      猜你喜欢
      • 1970-01-01
      • 2012-12-01
      • 2012-08-18
      • 1970-01-01
      • 2023-03-04
      • 1970-01-01
      • 2018-03-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多