【多线程-第一天-NSThread-属性的修饰符-三种block-weak和assign的区别 Objective-C语言】

一、属性的修饰符

1.我们一块儿复习一下,我们以前学过的,属性的修饰符,

什么是属性的修饰符:

1)strong

2)weak

3)copy

4)assign

通知

我们定义一个copy属性,@property(nonatomic,copy)NSString *name;

// 属性修饰符

// strong

// weak

// assign

// copy

通知

2.字符串为什么要用copy,

self.name =

我给它赋一个值,当然这个值是计算出来的,怎么计算出来的,我拼接字符串计算出来的,拼接字符串,我要用什么,NSMutableString ,

NSMutableString *str = [NSMutableString string];

通知

NSMutableString *str = [NSMutableString string];

[str appendString:@“hello”];

self.name = str;

这么写,没问题吧,当这行代码self.name = str,执行完成之后,因为我程序是顺序往下执行的,我下面还要去拼接这个字符串,我再拼接一个字符串,

[str appendString:@“zs”];

通知

我现在输出self.name,

NSLog(@“%@”,self.name);

我输出的是hello,还是hello zs,

运行一下,

通知

输出的是hello,

那,我们希望的这个self.name,是不是就是hello,这是我们希望的值吧,因为这块儿写的就是copy吧,

这块儿为什么用copy,如果这块儿不用copy,应该用什么,strong吧,

NSString是不是一个类,这是一个对象,这是一个OC对象,所以如果不用copy的话,这块儿应该用,strong,

我们再来运行一下,如果这块儿是strong,输出的是hello、还是hellozs、

通知

输出的是什么,hellozs,

为什么呢,当这个位置是copy的时候,输出的是hello、

当这个位置是strong的时候,输出的是hellozs、

当这个位置是copy和strong的时候,输出的结果是不一样的,为什么,

当是strong的时候,我们看一下代码是怎么去工作的,代码从上往下依次执行,

通知

到这个位置,这个MutableString,有值了,有值之后,下面这行代码,这是关键,

通知

把string,mutableString,是不是赋给了self.name,

它是什么,*str,带着星,说明是,地址,

通知

所以,我们这个位置,在赋值的时候,如果我们这个name,是用strong修饰的,

通知

这个name,是不是也带着一个星,这个name,是不是也是个地址,其实就是让self.name,这个地址,指向了str,

当str的值发生了变化,那我的self.name,是不是也发生了变化,

因为我的地址,是不是指向你了,

所以,当,MutableString的值,发生了变化,那我这个name的值,也发生了变化,这是我们不希望的,因为我们希望,这块儿,已经把这个人的名字,算好了,下面是算别的事情,我们不希望这样的事情发生,所以,这个string,应该改成,copy,

那,改成copy,又是什么意思呢,改成copy以后,执行这行代码的时候,

self.name = str;

通知

改成copy之后,执行这行代码的时候,会对这个str,先做一次copy操作,先复制了一份儿,我们在对MutableString,进行copy操作的时候,就是把可变,变成了不可变,复制了一个不可变对象,所以,复制了一份儿,等于这个self.name,

那,将来,不管你这个MutableString怎么变,我这个name,都是不会变化的,因为复制了一份儿,

我们把这儿改成strong,我们把这儿,加一个copy,

通知

我们运行,结果是什么,hello、还是hellozs、

通知

运行,结果是hello,是不是就跟我们刚才分析的结果是一样的,

那这块儿改成copy,其实就是自动的帮我们做了一下这件事情,

通知

这就是字符串为什么用copy,

通知

字符串为什么用copy:当给这个属性赋值,mutableString的时候,如果用strong修饰的话,那它是一个地址的指向,然后,当mutableString的值发生了变化,我们name的值,指向的是,始终是最新的那个值,我们需要把这儿改成,copy,

通知

这是字符串为什么要用copy,接下来再来看,谁还要用copy修饰,

2.block,为什么要用copy,

通知

这个之前讲过没,我们先把前面的注释起来,再来看第二个,

通知

看第二个的话,我们先要定义一个block,block怎么定义的,

先写返回值,void,block就是一个函数,

所以,定义block的时候,就想函数的那个三要素,

void ()()

返回值 - 函数的名称 - 参数

但是block比较特殊,要加一个^,

通知

void (^demo)() = ^ { } ;

其实,我们省了一个东西,这个位置,有个小括号呢,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清风清晨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值