【问题标题】:Is my understanding of 'self' correct?我对“自我”的理解正确吗?
【发布时间】:2012-01-27 21:15:40
【问题描述】:

我将提供一个简单的方法,然后解释我的看法,如果这不正确,请告诉我并纠正我。我觉得我了解“自我”,但仍然怀疑自己。

  -(NSString *)giveBack {
    NSString *string = [NSString stringWithFormat:@"Hi there!"];
    return string;
}

-(IBAction)displayIt {
    NSString *object = [self giveBack];
    [myView setText:object];
}

“myView”是一个 UITextView 对象。

现在至于“自我”..

我基本上是在我的 -displayIt 方法中说,我正在创建一个名为“object”的 NSString 对象,并在其中存储一个方法,该方法返回一个显示“Hi there”的字符串。 这个方法(名为'giveBack')是在我的班级名称上执行的(无论我给项目起什么名字)。这是正确的吗?

【问题讨论】:

    标签: objective-c cocoa-touch methods self


    【解决方案1】:

    我认为,您通常是正确的。

    但在下面提到:

    并且这个方法(名为“giveBack”)是在我的班级名称上执行的(无论我给项目起什么名字)

    我不明白你的意思。

    类名只是一个符号(即供人类阅读的文本)。

    Objective-C 类的方法由方法声明开头的- 表示法指示。

    换句话说,@implementation CLASS_NAME ... @end 块中所有以- 开头的方法声明都是 CLASS_NAME 类的实例方法。

    当我们调用另一个实例方法(在一个实例方法中)时,我们使用self 关键字。因为所有的 Objective C 方法调用都必须指定目标对象,在这种情况下,我们正在调用自己(当前 CLASS_NAME 实例本身)。所以我们使用self关键字。

    对不起,我的措辞令人困惑。我想这很难解释:-(

    【讨论】:

    • 非常感谢,你帮了大忙。
    【解决方案2】:

    不,您不是在创建一个名为 object 的对象,然后在其中存储一个方法等。您正在创建一个 variable,它可以保存一个 reference 到对象并在其中存储对通过调用方法获得的对象的引用。

    [注意:以下假设您正在使用自动内存管理(ARC 或垃圾收集),不会提及引用计数。如果您使用手动记忆,则需要考虑更多...]

    为您的示例添加行号:

    1. -(NSString *)giveBack
       {
    2.     NSString *string = [NSString stringWithFormat:@"Hi there!"];
    3.     return string;
       }
    
    4. -(IBAction)displayIt
       {
    5.     NSString *object = [self giveBack];
    6.     [myView setText:object];
       }
    
    1. giveBack 声明为类的instance 方法,要调用它必须在特定实例上调用。

    2. RHS ([NSString stringWithFormat:@"Hi there!"]) 调用一个类方法,该方法创建一个NSString 类型的对象并返回一个NSString * 类型的对该对象的引用。 LHS 声明了一个 variable (string),它可以保存对 NSString 对象的引用。赋值 (=) 将 RHS 返回的引用存储到 LHS 声明的变量中。

    3. 返回string中的值作为方法的结果

    4. 声明一个名为displayIt的实例方法

    5. RHS:在对象实例 self 上调用实例方法 (giveBack) - self 是在实例方法中时对当前对象实例的引用(在本例中为 displayIt)。 LHS:声明一个变量,object,类型为NSString *。赋值:将RHS上的方法调用返回的NSString的引用存储到LHS上声明的变量中。

    6. 在变量myView引用的对象实例上调用实例方法setText:,将引用传递给变量object中的NSString

    【讨论】:

    • 这是迄今为止我读过的最好的解释.. 我刚明白.. 顺便说一句,我在原始帖子中措辞很糟糕,但我几乎知道一切是如何运作的第 1-4 行。当自我开始发挥作用时,我不确定。但是谢谢你为我清理一切..
    • 天哪……我必须告诉你,在这之后……就像你打开了闸门,所有的信息都在流入,现在一切都变得非常非常有意义。 . 再次感谢。
    【解决方案3】:

    您存储的是“giveBack”返回的字符串,而不是方法本身。该方法是类的一部分。 'self' 是您在其上调用 'giveBack'(以及 'displayIt')的对象的实例。

    【讨论】:

    • 我知道我没有存储实际的方法,这只是我的措辞不好。至于第二句话..这是否意味着我正在调用的对象的实例这个方法是我目前正在编写这个方法的类吗?因此,如果我要创建一个名为“HelloWorld”的 Xcode 项目,那将是我调用 'gieBack' 方法的对象..
    猜你喜欢
    • 2021-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多