我有一节课:
@interface Person : NSObject {
NSString *_firstname;
}
@property NSString *firstName;
@end
@implementation Person
@synthesize firstname;
@end
这将声明三个变量:firstname,self.firstname和_firstname
三个变量之间有什么区别?你如何使用每个案例?
答案 0 :(得分:1)
在现代Objective-C中,如果已经合成了属性,则无需创建实例变量
从你所写的内容来看,你似乎混淆了属性和ivar
属性为你的ivars创建getter和setter,但它们不是ivars,它们是访问你的方法来设置或获取它们的值。
你的课可以这样总结:
@interface Person : NSObject
@property NSString *firstName;
@end
@implementation Person
@end
在编译时,这将确保您可以使用方法访问您的ivar并将您的ivar命名为_firstName
。
点表示法创建对属性的访问权限,因此self.firstName
(使用ARC和默认属性选项-nonatomic,strong-)调用该方法
- (NSString*)firstName
{
return _firstName;
}
在拨打self.firstName = @"foo";
来电时:
- (void) setFirstName:(NSString*)name
{
if (_firstName == name) {
return;
}
_firstName = name;
}
强调实施可能会有所不同。
答案 1 :(得分:0)
第一个NSString *_firstname;
是一个实例变量。 @property是一个合成的属性(您不必手动合成现代Objective-C中的属性)。声明属性时,可以使用_propertyName或self.propertyName访问其实例变量。
由您决定将变量声明为实例变量还是属性,但是它更常见并建议将它们声明为属性(使用属性可以访问getter和setter,这意味着您可以运行代码在设置或将要读取属性的值之前。)
答案 2 :(得分:0)
您可以使用
将实例与属性链接起来@interface Person : NSObject {
NSString *_firstname;
}
@property NSString *firstName;
@end
@implementation Person
@synthesize firstName = _firstname;
@end
这两个指针现在指向同一个实例。