点语法:点语法的本质还是方法调用
Person *p = [Person new]; // 点语法的本质还是方法调用 p.age = 10; // [p setAge:10]一.点语法注意点:
@implementation Person
//setter方法中的死循环 -(void)setAge:(int)age { // 会引发死循环,不停的调用setter方法[self setAge:age] self.age = age; }
- (int)age {
// 下面也会引发死循环,调用getter方法[self age]
return self.age; // 应该这样输出:return _age; 或者 return self->_age; }
在使用点语法中,可以使用断点进行测试,确保输出无误。
二.成员变量的四种作用域
1.@public // 在任何地方都可以访问成员变量
@interface Person : NSObject { @public int _age; int _height; }
2.@private // 只能在当前类的对象方法中直接使用(私有)
@interface Person : NSObject { @private
int _age;// 默认就是私有 }
3.@protected // 能在当前类和子类的对象中访问,默认情况在.h文件下什么都不写就是@protected
@interface Person : NSObject { //什么都不写,默认就是@protected int _age; int _height; }
4.@package // 同一个体系“框架”可以访问,介于@private和@public之间,一般很少用到,暂不描述
成员变量的注意点:
默认情况下在声明(@interface)中的变量默认是@protected,在实现(@implementation)中默认是@private
原因是:.m文件一般不能被包含,所以它是私有的。
@interface和@implementation不能声明同名的变量
三. 两个关键字@property和@synthesize
@property作用:帮助我们自动生成setter 和getter的声明
@interface Person : NSObject</span></span>
@property int age; // 自动生成setter声明,和getter声明</span></span>
// -(void)setAge:(int)age;
// -(int)age;
</pre><pre name="code" class="objc">@end
@implementation Person //会自动生成age的setter和getter实现,并且会访问_age这个成员变量 @synthesize age = _age; @end
@interface Person : NSObject</span>
//生成age和weight属性的声明 @property age = _age, weight = _weight; @end
@implementation Person //生成age和weight属性的实现
@synthesize age = _age, weight = _weight;
@end
注:在没有写成员变量的情况下,@synthesize会自动生成所需要成员变量。
例如:
@implementation Person //会访问_age这个成员变量,如果不存在,就会自动生成@private类型的_age变量 @synthesize age = _age; @end
注:如果在实现中@implementation
@synthesize age; // 它会访问跟名字一模一样的age