我目前正在学习用于iOS编程的Obj-C,但有一些我很困惑的概念。具体来说,是getter和setter访问器。
我正在阅读有关它们的几个不同的东西 - 有些人说它们是在你使用@property时自动创建的,而且不需要手动设置它们,其他人说你需要使用@synthesize。
请参阅以下代码的评论。我对实际手动编码需要的东西以及调用该方法的正确方法感到困惑。
// 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;
}
答案 0 :(得分:4)
您正在阅读的一些内容是旧信息。 @synthesize曾经是必需的(并且仍然可以使用),但它现在在编译期间自动添加(你通常应该使用该选项)。
@interface中不需要-(NSString *) firstName;
,因为@property定义已经定义了它。
//我是否需要以下代码或是否自动创建?
不,你不需要它,它是为你自动生成的。如果你想做一些特别的事情,你只能自己实现这些方法。通常,自动生成的版本很棒,因为您指定了如何在@property定义(nonatomic, strong)
中实现这些方法以及它为您做的事情。如果您自己实现这些方法,那么您正在颠覆它(因此@property定义可能会变成谎言......)。
aClass.firstName = @“Richard”; //这会调用setFirstName吗?
是的。编译器实际上将其转换为:
[aClass setFirstName:@"Richard"];
给你。