1.属性:帮你自动生成set和get方法
属性的格式:
(1)@property 数据类型 属性名
属性的声明:写在(.h)中
属性:属性名就是实例变量声明
@property
NSString
* gender;
(2)@synthesize 属性名
属性的实现:写在(.m)中
//相当于set和get方法的声明
//如果属性的类型相同的话,此时就可以把他们写在一个属性的声明中,但是每一个属性名前要加星号*;是基本数据类型就不用加*
@property NSString *name,*color;
@property NSInteger age;
//如果属性的类型相同的话,此时就可以把他们写在一个属性的声明中,但是每一个属性名前要加星号*;是基本数据类型就不用加*
@property NSString *name,*color;
@property NSInteger age;
@property
CGFloat
score;
(3)
//相当于set和get方法的实现
//当属性的实现部分可以写在一起,用逗号隔开
//Xcode5.0以后属性的实现就不在写了,极大的提高了编程的速度
//如果不写了,系统默认帮你生成以下语句,自动创建一个_name实例变量,并且自动生成set和get方法
//如果实例变量不写
//相当于set和get方法的实现
//当属性的实现部分可以写在一起,用逗号隔开
//Xcode5.0以后属性的实现就不在写了,极大的提高了编程的速度
//如果不写了,系统默认帮你生成以下语句,自动创建一个_name实例变量,并且自动生成set和get方法
//如果实例变量不写
//@synthesize name = _name;
(4)description 唯一不能单独打印的就是self
- (NSString *)description
{
return [NSString stringWithFormat:@"%@ %ld %.2f %@ %@", _name,_age,_score,_color,self];
(5)当属性帮你生成的set和get方法的实现,不满足你的需求,可以重写set个get方法
(6)当完全重写属性的set和get方法时,
@synthesize name =_name
就失效了;解决问题的方法:a.只重写set和get方法中的一个 2.自己添加@synthesize
(7) return self.name; 方法内部是不能自己调用自己的
2.快捷的访问set和get方法:用点语法
3.属性的优化
(1)属性声明和实现可以合并
(2)可以省略实例变量的声明(系统会自动帮你生成属性名加_下划线的实例变量)
(3)属性的实现可以省略
4.属性的属性:属性的修饰符,主要用类控制set和get方法的实现细节
5.访问控制组
(1)atomic:原子性修饰的属性同一时刻只能使用set和get方法(set和get放发式互斥的),安全,但是效率低默认值
(2)noatomic:非原子性,允许我们同时使用set和get方法,不安全,效率高,推荐使用noatomic
(3)atomic使用场景:在多线程下为保护数据安全可以使用atomic
6.内存管理组
(1)assign 默认值 基本数据类型使用assign修饰,代理属性使用assign修饰
(2)retain 对象类型一般就是用retain
(3)copy 字符串一般使用copy修饰,如果要使用copy修饰属性,这个属性必须遵循NSCopying协议
(4) 属性修饰符写在@property()的后面的小括号中;
属性修饰符可以写多个,每一个修饰符之间用逗号隔开
@property
(
nonatomic
,
copy
,
readwrite
,
setter
= setAAA:,
getter
= AAA)
NSString
*name;
(5)
@property的参数
(1)内存管理相关参数
Retain:对对象release旧值,retain新值(适用于OC对象类型)
Assign:直接赋值(默认,适用于非oc对象类型)
Copy:release旧值,copy新值
(2)是否要生成set方法(若为只读属性,则不生成)
Readonly:只读,只会生成getter的声明和实现
Readwrite:默认的,同时生成setter和getter的声明和实现
(3)多线程管理(苹果在一定程度上屏蔽了多线程操作)
Nonatomic:高性能,一般使用这个
Atomic:低性能
(4)Set和get方法的名称
修改set和get方法的名称,主要用于布尔类型。因为返回布尔类型的方法名一般以is开头,修改名称一般用在布尔类型中的getter。
@propery(setter=setAbc,getter=isRich) BOOL rich;
BOOL b=p.isRich;//
调用
7.对象控制组
(1)readWrite:可读可写,系统自动帮你生成set和get方法 默认值
(2)readOnly:只读的,系统自动帮你生成get方法
8.重命名组
(1)setter = setter 新名字
(2)getter = getter 新名字
(3) //苹果的习惯,如果一个属性是BOOL类型的,会对getter方法重命名
@property(nonatomic,assign,readwrite,getter=isFalg)BOOL flag;
@property(nonatomic,assign,readwrite,getter=isFalg)BOOL flag;
9.KVC key
—
value
—
Coding 键值编码 KVO观察者模式
通过KVC访问实例变量,是一种间接的访问实例变量的形式
(1)通过key值去类中查找实例变量,先判断有没有实例变量name,如果有就赋值,如果没有,接着判断有没有下划线name,如果有就赋值
[man setValue:@"zhangyu" forKey:@"ame"];
NSLog(@"%@",[man valueForKey:@"_ame"]);
(2) 想通过man这个对象给Girl这个对象的名字赋值@“棉花”
[[man valueForKey:@"girlFriend"]setValue:@"棉花" forKey:@"name"];
//通过kvc把@“棉花”打印出来
NSLog(@"%@",[[man valueForKey:@"girlFriend"]valueForKey:@"name"]);
//通过kvc把@“棉花”打印出来
NSLog(@"%@",[[man valueForKey:@"girlFriend"]valueForKey:@"name"]);
(3) //kvc通过路径赋值取值
[man setValue:@"菊花" forKeyPath:@"girlFriend.name"];
NSLog(@"%@",[[man valueForKey:@"girlFriend"]valueForKey:@"name"]);
[man setValue:@"菊花" forKeyPath:@"girlFriend.name"];
NSLog(@"%@",[[man valueForKey:@"girlFriend"]valueForKey:@"name"]);
NSLog(@"%@",[man valueForKeyPath:@"girlFriend.name"]);