声明变量时的差异

时间:2015-03-06 06:46:18

标签: ios objective-c

我有一节课:

@interface Person : NSObject {
  NSString *_firstname;
}
@property NSString *firstName;
@end

@implementation Person

@synthesize firstname;

@end

这将声明三个变量:firstname,self.firstname和_firstname

三个变量之间有什么区别?你如何使用每个案例?

3 个答案:

答案 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

这两个指针现在指向同一个实例。