第一种方式。
//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'方法,第一种方式不能访问其他对象的私有成员变量,但第二种方式可以使用'。'访问。
原谅我的英语。
答案 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语法,因此程序员不必为他/她想要使用的任何其他变量编写基本相同的代码:)