成员变量、属性、合成方法

来源:互联网 发布:linux安装kvm虚拟机 编辑:程序博客网 时间:2024/06/08 14:19

1.属性
ARC: 默认为(nonatomic,assign)

创建对象时一般应强引用,声明为:对象(nonatomic,retain) 字符串(nonatomic,copy) 基本类型(nonatomic,assign)

MRC:默认为(nonatomic,weak)

创建对象时一般应强引用,声明为:对象(nonatomic,strong) 字符串(nonatomic,copy) 基本类型(nonatomic,weak)

@property (nonatomic) int xxxx;
- (void)setXxxx:(int)xxxx;
- (int)xxxx;
自动声明setter和getter方法

@synthesize xxxx = _xxxx;
自动实现setter和getter方法

assign 直接赋值
readonly 只生成getter方法 不会产生setter
readwrite 生成setter和getter方法
atomic 原子操作 考虑线程安全
nonatomic 非原子操作 不考虑线程安全

一般iOS程序中,所有属性都声明为nonatomic。
atomic是Objc使用的一种线程保护技术,基本上来讲,是防止在写未完成的时候被另外一个线程读取,造成数据错误。

从xcode4.3版本开始 可以只写@property int x; 不写@synthesize x = _x;
编译器会自动的加上@synthesize x = _x;
@synthesize b = _b; 当编译器执行@synthesize这句话首先查看类的成员变量中有没有_b 如果有那么生成的setter和getter方法直接变量_b操作 如果没有那么@synthesize会自动的创建一个私有的成员变量_b,并且自动生成setter和getter方法对_b变量进行赋值和读取

2.合成方法
@synthesize score = _blood;
// 合成
// 这样合成相当于
// 1. 成员变量:float _blood;
// 2. - (void)setScore:(float)xxx;
// 3. - (float)score;

/ 注:如果既声明了属性,又实现它的getter setter
// 默认就不会自动合成 @synthesize height = _height;
// 我们的成员变量_height就没有了
// 解决方法1: 加成员变量float _height;
// 解决方法2: 手动合成 @synthesize height = _height;

3.属性修饰符
3.1 assign
assign是弱引用,只是指向某个对象,但是并不强引用,对于基本数据类型,比如float integer … assign写与不写都一样,因为对于基本数据类型,按值传过来的
3.2 readonly
readonly只合成getter方法,没有setter方法
readonly 只合成getter方法,没有setter方法
使用readonly相当于二步:
1. float _height;
2. - (float)height;
3. set 方法没有

3.3 readwrite
readwrite 默认 生成setter和getter方法

3.4 字符串声明成copy,而不是assign和其他东西

3.5 扩展
// @interface class name : superclass // 继承
// @interface class name (category name) // Category 扩展 类别
// @interface class name () // Extension 延展 匿名类别
// 匿名类别写在.m文件中,放一些私有的东西

4 . 深浅拷贝
4.1 浅拷贝
// Foundation基础类,字符串,数组,字典,集合,不可变类,调用copy,是浅拷贝,甚至可以理解为它的作用相当于retain
// 注意这里浅拷贝有两个条件:
// 第一是这些Foundation基础类
// 第二是不可变对象
// 第二是调用copy方法

NSArray *array = [[NSArray alloc] initWithObjects:@"one", @"two", nil]; NSArray *copyArr = [array copy];

4.2 深拷贝
// 注意:对于Foundation中这些可变对象,调用copy生成了一个新的不可变对象
// 所以这就是我们为什么常把字符串属性写成copy的原因

NSMutableArray *mArr = [[NSMutableArray alloc] initWithObjects:@"宝贝", @"真真", @"爱爱", @"连连", nil];NSArray *mArr2 = [mArr copy];

// 总结:对于系统的这些可变对象,调用copy时,是深拷贝,对象的内容被copy

0 0