一.点语法
点语法的本质是对 set 和get方法的调用.
Student *stu = [[Student alloc] init];
stu.ID = 10;//set方法
注意:
1.stu.ID = 10,不是给Student成员变量ID “直接赋值”,而是调用Student中的setID方法,“间接”给成员变量赋值,并且传递10,所以 stu.ID = 10 等于 [stu setID :10];
2.也可以调用get方法,可以点语法写为 stu.id , 相当于 【stu ID】;
3.在其他文件中访问该类的成员变量只有一种方式即使用"->" 如stu->ID,这种情况要求在@public修饰的前提下。
在本类中可以 "_ID" 或 stu -> "ID";
死循环的两种方式:
4.在set方法中,self.age=age;相当于是[self setAge:age];
5.在get方法中,return self.age;相当于是[self age];
6.如果属性没有封装setter getter 是无法使用点语法的。
例子:
二.属性:
@property @synthesize关键字
在 OC 中经常使用 get 和 set 方法,但是当成员变量太多的时候,就要敲很多行 get 和 set 方法。在 xcode4.4 之前,为了简洁代码。
1.可以使用@property 自动生成某个“成员变量” get 和 set 方法 声明
//当编译,遇到这行时
@property int age;
//自动生成set/get方法
-(void)setAge:(int)age;
-(int)age
2.可以使用@synthesize 帮助生成“成员变量”的get 和 set方法 实现 ,并且会访问_age这个成员变量。
@synthesuze age = _age;
//自动生成
-(void)setAge:(int)age{
_age = age;
}
-(int)age{
return _age;
}
注意点:
@synthesize age = _age;
- setter 和 getter 实现中会访问成员变量 _age
- 如果成员变量 _age 不存在,就会自动生成一个 @private 的成员变量 _age
@synthesize age;
- setter 和 getter 实现中会访问成员变量 age
- 如果成员变量 age 不存在,就会自动生成一个 @private 的成员变量 age
- 如果类中同时存在成员变量 age 和_age,则默认情况下会访问与 age 名字一样 的成员变量,即访问 age 而不是_age。
例子:
@property只能写在@interface @end中,@synthesize只能写在@implementation @end中
以上的写法,在Xcode4.4以前。
Xcode4.4以后,property增强版。
最新版的功能:
@property int age;这句话完成了3个功能:
(1)生成_age成员变量的get和set方法的声明;
(2)生成_age成员变量set和get方法的实现;
(3)生成一个_age的成员变量。
注意:这种方式生成的成员变量是private的。
也可以通过在{}中加上int _age;显示的声明_age为protected的。
原则:get和set方法同变量一样,如果你自己定义了,那么就使用你已经定义的,如果没有定义,那么就自动生成一个。
手动实现:
(1)如果手动实现了set方法,那么编译器就只生成get方法和成员变量;
(2)如果手动实现了get方法,那么编译器就只生成set方法和成员变量;
(3)如果set和get方法都是手动实现的,那么编译器将不会生成成员变量。
@interface YourClass : NSObject{
//方法1
NSMutableArray *_mas;
}
@property (nonatomic,strong) NSMutableArray *mas;
@end
@implementation YourClass
//方法2
@synthesize yourProperty = _yourProperty;
-(void)setMas:(NSMutableArray *)mas{
}
-(NSMutableArray *)mas{
if (!_mas) {
_mas = [NSMutableArray array];
}
return _mas;
}
@end
注意:父类的property一样可以被子类继承,但是生成的属性是私有的,可以通过setter getter方法来访问