iOS_copy,strong,weak...整理

这篇没什么好说的,基础知识很重要,就算你是半路出家,基础知识的不扎实也并不是理由,赶紧来集中突击一下。

我们不去细说MRC时引用计数的+1-1了,直接上一些对比的实例。


1.字符串你是用copy还是strong

作为一个对代码很粗鲁的选手,我在声明所有变量的时候能用strong时都用了strong。但是在查询后,发现大家通常使用的都是copy,为什么呢?虽然在开发过程中用strong好像也没有什么问题,但是对于字符串,我们希望是一次内容的拷贝,外部修改也不会影响我们的原来的值,而且NSString是遵循了 "NSCopying" "NSMutableCopying" "NSSecureCoding协议。

NSSecureCoding 是什么?待填坑 ——


2.block声明使用copy

在使用block时,尽量使用 "typedef" 来起一个别名,这样更容易阅读。使block作为属性时,使用 "copy" 

<span style="font-family:Microsoft YaHei;font-size:14px;">typedef void (^backBlock)(NSString *name);

@property (nonatomic, copy) backBlock testBlock;</span>


多两句嘴,typedef是什么?

typedef 是C语言中一个常用的关键词,可以使用这个关键字为各种数据类型定义一个新名字(别名)。

<span style="font-family:Microsoft YaHei;font-size:14px;">typedef int Integer;
typedef float Float;

- (void)viewDidLoad {
    [super viewDidLoad];
    
    Integer i = -10;
    Float aa = 5.0f;
}</span>


typedef 还可以给指针起别名。

//typedef char *String;


typedef 起别名的范围还很广,比如结构体、枚举等。

typedef 与#define的区别在于,typedef 处理过后的对象也算是一种数据类型可以连续声明,但是 #define 的就是纯粹的字符串替换了。


还有一句嘴,就是block为什么要用copy?

对于这个我只能写上最外层的解释,copy后的Block才会在堆中,栈中的Block的生命周期是和栈绑定的,更多的堆栈原理就直接pass吧。


3.strong和week

strong,用来修饰强引用的属性。

strong和retain相似,只要有一个strong指针指向对象,该对象就不会被销毁。

__strong:对于变量的声明,如果要使用强引用,可以使用__strong,默认就是__strong,因此不写与写__strong声明都是一样的。


weak,用来修饰弱引用的属性。

声明为weak的指针,weak指针指向的对象一旦被释放,weak的指针都将被赋值为nil;

weak:对于xib上的控件引用,可以使用weak,也可以使用strong。


4.关于属性的这些选项的学习,做一下总结:

所有的属性,都尽可能使用nonatomic,以提高效率,除非真的有必要考虑线程安全。

NSString:通常都使用copy,以得到新的内存分配,而不只是原来的引用。

strong:对于继承于NSObject类型的对象,若要声明为强使用,使用strong,若要使用弱引用,使用__weak来引用,用于解决循环强引用的问题。

weak:对于xib上的控件引用,可以使用weak,也可以使用strong。

__weak:对于变量的声明,如果要使用弱引用,可以使用__weak。

__strong:对于变量的声明,如果要使用强引用,可以使用__strong,默认就是__strong,因此不写与写__strong声明都是一样的。

unsafe_unretained:这个是比较少用的,几乎没有使用到。在所引用的对象被释放后,该指针就成了野指针,不好控制。

__unsafe_unretained:也是很少使用。同上。

__autoreleasing:如果要在循环过程中就释放,可以手动使用__autoreleasing来声明将之放到自动释放池。


5.nonatomic与atomic

nonatomic,是非原子性的,不会给线程加原子锁,当不再多线程下时这个成员的声明效率会极大的增加。

atomic,会在多线程操作时加锁,中间的执行层是处于一个被保护的状态。

这是一种oc使用的线程保护技术,所以相比而言就会慢上许多。(编辑器有问题我这句要写两行好尴尬)


感谢观看,学以致用更感谢!



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值