这里是一些基础属性的介绍:
- @Property功能:提供成员变量的访问方法的声明、控制成员变量的访问权限、控制多线程时成员变量的访问环境
atomic是Objc使用的一种线程保护技术,基本上来讲,是防止在写未完成的时候被另外一个线程读取,造成数据错误。而这种机制是耗费系统资源的,所以在iPhone这种小型设备上,如果没有使用多线程间的通讯编程,那么nonatomic是一个非常好的选择,指出访问器不是原子操作,而默认地,访问器是原子操作。这也就是说,在多线程环境下,解析的访问器提供一个对属性的安全访问,从获取器得到的返回值或者通过设置器设置的值可以一次完成,即便是别的线程也正在对其进行访问。如果你不指定 nonatomic ,在自己管理内存的环境中,解析的访问器保留并自动释放返回的值,如果指定了 nonatomic ,那么访问器只是简单地返回这个值。atomic是线程安全的,nonatomic是线程不安全的。如果只是单线程操作的话用nonatomic最好,因为后者效率高一些
可读性:readonly 、readwrite 如果不写默认是readwrite通过加入readwrite属性你的变量就会有get方法,和set方法
- retain,setter方法对参数进行release旧值再retain新值,所有实现都是这个顺序
- copy,setter方法进行Copy操作,与retain处理流程一样,先旧值release,再Copy出新的对象,retainCount为1。这是为了减少对上下文的依赖而引入的机制
- 常量在常量区,同一个常量的地址是一样的 在ARC中 strong 相当于retain weak相当于assign,当对象被释放的时候weak的setter里面赋值为nil assign容易形成野指针 oc中向nil发送消息不会崩溃
Copy与MutableCopy探索
- 用MutableCopy复制的 系统会从新申请一块内存给该对象 常量 retain strong copy 地址一样
NSString* str = @"qwe";
NSLog(@"str %p",str);
NSString* str1 = [str copy];
NSLog(@"str1 %p",str1);
NSString* str2 = [str mutableCopy];
输出结果
NSArray* arr = @[@"123"];
NSLog(@"arr %p",arr);
NSArray* arr2 = [arr copy];
NSLog(@"arr2 %p",arr2);
NSArray* arr3 = [arr mutableCopy];
NSLog(@"arr3 %p",arr3);
输出结果
- 对于 可变 数组 字符串 来说 mutablecopy 和copy都是创建新内存
NSMutableString* mutableStr = [NSMutableString stringWithFormat:@"qwe"];
NSLog(@"mutableStr %p",mutableStr);
NSString* mutableStr1 = [mutableStr copy];
NSLog(@"mutableStr1 %p",mutableStr1);
NSMutableString* mutableStr2 = [mutableStr mutableCopy];
NSLog(@"mutableStr2 %p",mutableStr2);
输出结果
- 关于数组(可变和不可变) 引用计数加1,同时array里面的对象的地址都是一样的 但是 不可变数组的copy地址是不变得 mutableCopy是变化的 可变数组的copy与mutableCopy的地址都是变化的 可以自己试验
[self.retain1 addObject:str];
[self.retain1 addObject:mutableStr];
self.strong1 = [NSArray arrayWithObjects:str,mutableStr, nil];
// NSArray* mutableCopyArray = [self.retain1 mutableCopy];//地址变了 内部元素指针没变
// NSArray* CopyArray = [self.retain1 copy];//地址变了 内部元素指针没变
NSArray* mutableCopyArray = [self.strong1 mutableCopy];//地址变了 内部元素指针没变
NSArray* CopyArray = [self.strong1 copy];//地址不变 引用计数加1 内部元素指针没变
[mutableStr appendFormat:@"asd"];
NSLog(@"strong1 %p",self.strong1);
NSLog(@"mutableCopyArray %p object1 %p object2 %p",mutableCopyArray,[mutableCopyArray objectAtIndex:0],[mutableCopyArray objectAtIndex:1]);
NSLog(@"mutableCopyArray object1 %@ object@ %@",[mutableCopyArray objectAtIndex:0],[mutableCopyArray objectAtIndex:1]);
NSLog(@"CopyArray %p object1 %p object2 %p",CopyArray,[CopyArray objectAtIndex:0],[CopyArray objectAtIndex:1]);
NSLog(@"CopyArray object1 %@ object@ %@",[CopyArray objectAtIndex:0],[CopyArray objectAtIndex:1]);
NSLog(@"retain%p object1 %p object2 %p",self.retain1,[self.retain1 objectAtIndex:0],[self.retain1 objectAtIndex:1]);
NSLog(@"retain object1 %@ object2 %@",[self.retain1 objectAtIndex:0],[self.retain1 objectAtIndex:1]);