属性
属性的作用:1.定义了一个成员变量,成员变量的命名是_ 加上属性名 2.属性声明并实现了setter和getter方法
属性的属性:
1.读写性
(1)就是对设置器和访问器进行控制,默认是可读可写,readwrite
(2)readonly:只读,被他修饰的属性只有getter方法,没有setter方法
(3)getter = method相当于给getter方法重新起名
(4)当设置setter的时候,别忘了新的名字加上冒号
2.原子性:nonatomic,atomic,默认是atomic,可以保证在多线程的情况下,访问数据,安全性高.但是我们一般只是普通赋值,打开线程锁反而浪费资源,所以我们一般填nonatomic
3.语义设置:和内存相关
(1)assign:一般基本数据类型使用,比如NSInteger,CGFloat等,这部分内容在栈区不需要管理内存
(2)retain:一般的对象类型,比如我们自己定义的类,系统提供的像数组等对象,都需要通过retain进行修饰.有它就不要重新设置setter方法
(3)copy:目前只有NSString使用.使用copy时需要copy协议
@synthesize在老的版本的xcode里.声明了一个成员变量,新版本不需要写,如果以后碰见,不用管
super:如果子类重写完父类的方法,但是还想执行父类的方法,可以用super作为消息的接受者,取执行相应父类的方法
便利构造器:先把父类继承过来的成员变量进行初始化
对象回到自己的类里成为self,如果返回了一个初始化失败的对象,就会返回一个空指针,空指针相当0,No就不会执行赋值的操作,只有返回一个有效的对象,才会进行赋值操作
- (id)initWithStuName:(NSString *)stuName
stuHobby:(NSString *)stuHobby
stuAge:(NSInteger)stuAge
stuScore:(CGFloat)stuScore{
// 先把父类继承过来的成员变量进行初始化
self = [super init]; // 对象回到自己的类里成为self
// 如果返回了一个初始化失败的对象,就会返回一个空指针,空指针相当于0,NO,就不会执行赋值的操作,只有返回一个有效的对象,才会进行赋值操作
if (self) {
_stuName = stuName;
_stuAge = stuAge;
_stuHobby = stuHobby;
_stuScore = stuScore;
}
return self;
}
便利构造器是类方法
+ (id)studentWithStuName:(NSString *)stuName
stuAge:(NSInteger)stuAge
stuHobby:(NSString *)stuHobby
stuScore:(CGFloat)stuScore{
Student *stu = [[Student alloc] initWithStuName:stuName stuHobby:stuHobby stuAge:stuAge stuScore:stuScore];
return stu;
}
点语法:
作用主要是为了方便对象快速对成员变量进行赋值和取值的操作,有等号的是设置器,没有等号是访问器
// per.age = 100;
// NSLog(@"%ld",per.age);