定义Private成员变量的两种方法有何不同

时间:2015-08-09 10:43:44

标签: ios objective-c iphone

第一种方式。

//Myclass.m
@implementation Myclass{
    NSString * name;
}
-(void) print{
    NSLog(@"%@",name);
}
@end

第二种方式。

//Myclass.m
@interface Myclass()
@property(nonatomic) NSString *name;
@end

@implementation Myclass
-(void) print{

    NSLog(@"%@",_name);
}
@end

为什么无法访问' name'通过' self.name'在第一种方式,但可以使用' self.name'和' _name'在第二种方式。两种方式有什么不同。

我对此感到困惑,因为我想要覆盖' isEqual'方法,第一种方式不能访问其他对象的私有成员变量,但第二种方式可以使用'。'访问。

原谅我的英语。

2 个答案:

答案 0 :(得分:1)

我不会使用这些。我总是只使用这个属性......

//Myclass.m
@interface Myclass()
@property(nonatomic) NSString *name;
@end

@implementation Myclass

-(void) print{
    NSLog(@"%@",_name);
    NSLog(@"%@",self.name);
}

@end

使用getter和setter方法将属性合成到iVars中。 iVar总是被称为_propertyName。

使用属性可以比使用iVars(无论如何都是IMO)更轻松地微调ARC的属性。

答案 1 :(得分:1)

当编译器看到@property时,它将生成一个setter和一个getter(取决于添加到属性中的注释)。因此在第一个示例中,编译器添加了两个方法:

- (void)setName:(NSString *)name {
...
}

- (NSString *)name {
...
}

所以你可以调用名为' name'在第一个例子中,因为它存在;)在第二个例子中,你必须把它们写成你自己。因为这种方法是锅炉板,所以添加了@property语法,因此程序员不必为他/她想要使用的任何其他变量编写基本相同的代码:)