【问题标题】:Why is Self being called to access the Class's own property?为什么调用 Self 来访问 Class 自己的属性?
【发布时间】:2012-06-08 03:57:42
【问题描述】:

我对某个概念有些困惑。问我问题的最好方法是用一个例子来说明它。现在在下面的代码中,我声明了一个名为 loan 的属性,并合成了这个属性。现在这似乎是一个小问题,但我将值“250.00”分配给贷款。我在网上看到过可能会执行“self.loan = 250.00;”的教程VS 我的“贷款 = 250.00;”两种方式似乎都完成了同样的事情。但是为什么人们使用“self.propertyName”来访问一个属性,而使用属性名本身就足够了?

//ClassA.h
@interface ClassA: UIViewController
@property double loan;
@end

//ClassA.m
@implementation ClassA
@synthesize loan;

-(void)doSomething{
  loan = 250.00;
}

【问题讨论】:

    标签: iphone objective-c xcode ipad properties


    【解决方案1】:

    @synthesize 还会为您的属性生成一个底层实例变量,不幸的是,默认情况下该变量与该属性命名相同。

    这意味着当您使用loan = 250.0 时,您实际上是在直接访问底层实例变量,而不是通过。属性访问器。如果您将 @synthesize 行更改为:

    @synthesize loan = _loan;
    

    现在您的代码不再编译,您必须使用self.loan 来访问它。生成的属性访问器,或_loan 访问底层实例变量。

    【讨论】:

    • 好的,我明白了。例如,这是否正确“self.loan = 10 + _loan;”这将是不正确的“self.loan = 10 + self.loan;”
    • 两者都是正确的:self.loan = 10 + self.loan被编译器翻译成[self setLoan:10 + [self loan]](使用@synthesize生成的方法)。几乎总是最好使用self.loan(属性访问器)而不是_loan(直接实例变量)。
    【解决方案2】:

    它们并不完全相同。

    self.loan = 250.00;
    

    是真正的简写

    [self setLoan:250.00];
    

    这是一个方法调用;而loan = 250.00 只是将该值直接写入内存的适当部分。

    例如,当另一段代码使用 Key-Value Observing 来监控贷款属性的更改时,这种差异很重要。通过调用setLoan:,将触发所有正确的通知。通过直接设置loan,它们不会。

    另外,如果您没有使用自动引用计数,set 方法将确保新值被保留并正确释放旧值。 (如果您使用 ARC,无论哪种方式都会自动处理。)

    【讨论】:

      【解决方案3】:

      这是因为self.loan 引用了属性,而loan 只是引用了底层变量。它是具有retaincopy 或其他修饰符的引用类型的关键。

      【讨论】:

        猜你喜欢
        • 2012-04-25
        • 2012-08-03
        • 1970-01-01
        • 1970-01-01
        • 2013-01-12
        • 2020-10-20
        • 1970-01-01
        • 1970-01-01
        • 2021-05-24
        相关资源
        最近更新 更多