【问题标题】:Confused About Getter and Setter对 Getter 和 Setter 感到困惑
【发布时间】:2014-03-18 08:21:10
【问题描述】:

我目前正在学习 Obj-C 以进行 iOS 编程,但有些概念让我感到困惑。具体来说,getter 和 setter 访问器。

我正在阅读一些关于它们的不同内容 - 一些人说它们是在您使用 @property 时自动创建的,无需手动设置,另一些人说您需要使用 @synthesize。

请查看下面代码中的 cmets。我对实际手动编码所需的内容以及调用该方法的正确方法感到困惑。

// SomeClass.h    
#import <Foundation/Foundation.h>

@interface SomeClass : NSObject

@property (nonatomic, strong) NSString *firstName;

-(NSString *) firstName;

@end


// SomeClass.m

#import "SomeClass.h"

@implementation SomeClass

// DO I NEED THE CODE BELOW OR ARE THESE AUTO-CREATED?
// ****************************************************
-(NSString *) firstName {
    return _firstName;
}

-(void) setFirstname:(NSString *) newValue {
    _firstName = newValue;
}
// ****************************************************

@end


int main () {

  @autoreleasepool {

    SomeClass *aClass = [[SomeClass alloc] init];

    // How would you set the first name?

    aClass.firstName = @"Richard";    //Does this call setFirstName?

    // OR

    [aClass setFirstName:@"Richard"];

  }



  return 0;
}

【问题讨论】:

  • link 看看这个。它回答了一切
  • 不是字符串属性通常应该定义为copy,而不是strong。

标签: objective-c getter-setter


【解决方案1】:

您正在阅读的某些内容是旧信息。 @synthesize 曾经是必需的(现在仍然可以使用),但现在它会在编译期间自动为您添加(您通常应该使用该选项)。

@interface 中不需要-(NSString *) firstName;,因为@property 定义已经定义了它。

// 我需要下面的代码还是这些代码是自动创建的?

不,您不需要它,它是为您自动生成的。如果你想做一些特别的事情,你只会自己实现这些方法。通常自动生成的版本很好,因为您在@property 定义(nonatomic, strong) 中指定了方法应该如何实现,并且它会为您处理。如果您自己实现这些方法,那么您就是在颠覆它(所以@property 定义可能会成为谎言......)。

aClass.firstName = @"理查德"; //这会调用setFirstName吗?

是的。编译器实际上将其转换为:

[aClass setFirstName:@"Richard"];

为你。

【讨论】:

    猜你喜欢
    • 2018-08-15
    • 1970-01-01
    • 2023-03-10
    • 2021-11-28
    • 1970-01-01
    • 2013-03-29
    • 2014-11-02
    • 1970-01-01
    • 2012-10-08
    相关资源
    最近更新 更多