【问题标题】:Objective-C member variable assignment?Objective-C 成员变量赋值?
【发布时间】:2010-12-27 21:44:52
【问题描述】:

我有一个带有成员变量的objective-c 类。我正在为每一个创建 getter 和 setter。主要用于学习目的。我的 setter 如下所示:

- (void) setSomething:(NSString *)input {
 something = input;
}

但是,在我过去使用过的 C++ 和其他语言中,您可以使用 this 指针来引用成员变量,例如 this->something = input。在 Objective-c 中,这被称为self。所以我想知道在objective-c中是否有可能这样做?像这样的:

- (void) setSomething:(NSString *)input {
 [self something] = input;
}

但这会调用something 的getter。所以我不确定。所以我的问题是:

有没有办法利用自指针进行赋值?

如果是这样,怎么做?

这是好的做法还是坏的做法?

谢谢!

【问题讨论】:

    标签: objective-c getter-setter


    【解决方案1】:

    是的,它使用与 C++ 相同的语法,用 self 代替 this

    self->something = input;
    

    【讨论】:

    • 值得一提的是,self-> 不是必需的,实际上没有人编写这样的代码。
    • 实际上,我们中的一些人确实使用self 来明确上下文,区分对象成员和局部变量。
    【解决方案2】:

    当您使用...时,您实际上是在隐含地使用“self”...

    something = input;
    

    ...如果没有本地“某物”变量。 (即:确实不需要添加明确的“自我”,人们通常不会。)

    也就是说,您的代码示例没有保留输入,因此它可能无法达到您的预期(好吧,在 NSString 的情况下不会崩溃很长时间)。

    因此,如果您真的想要编写自己的设置器(Objective-C property/synthesize 设置是一个很多少麻烦),你需要使用类似的东西:

    - (void) setSomething:(NSString *)input {
        if(something != input) {
            [input retain];
            [something release];
            something = input;
        }
    }
    

    【讨论】:

    • 为了避免释放旧值和分配新(保留)值之间的无效对象间隙,一个习惯用法是自动释放旧的something
    • 复制字符串通常比保留字符串更合适。
    猜你喜欢
    • 2015-04-28
    • 1970-01-01
    • 1970-01-01
    • 2011-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-06
    • 2012-02-02
    相关资源
    最近更新 更多