block用copy修饰,delegate 用weak修饰,

本文探讨了在iOS开发中,为何Block通常用`copy`修饰,而Delegate通常用`weak`修饰。内容涉及堆栈空间分配、堆栈缓存方式和堆栈数据结构的区别。同时,解释了Block的声明、定义格式以及如何避免循环引用问题。对于Delegate,文章解释了`weak`修饰符的作用,以防止循环引用导致的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考链接:http://www.jianshu.com/p/073db200b285

block: 用copy修饰

delegate:用weak 修饰


堆栈空间分配

栈(操作系统):由操作系统自动分配释放 ,存放函数的 参数值局部变量的值等。其操作方式类似于数据结构中的栈。
堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。

堆栈缓存方式

栈使用的是 一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放。
堆则是存放在 二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。

堆栈数据结构区别

堆(数据结构):堆可以被看成是一棵树,如:堆排序。
栈(数据结构):一种先进后出的数据结构。


------》》》》》》》》》》》》

typedef void(^BlockBack)(NSString *str);


@interface ViewController : UIViewController


- (void)loginWith:(NSString *)str

       completion:(BlockBack) block;


@property (nonatomic,copy) BlockBack myBlock;

@property (nonatomic,copy)void(^textBlock)(NSString * str);




Block属性的声明,首先需要用copy修饰符,因为只有copy后的Block才会在堆中,栈中的Block的生命周期是和栈绑定的

Block的定义格式

返回值类型(^block变量名)(形参列表) = ^(形参列表) {

};

调用Block保存的代码

block变量名(实参);

typedefvoid(^BlockType)(int);

//声明属性

@property (copy) BlockType myBlock; 

@property (nonatomic, copy)  void(^textBlock) (NSString*text); // 字符串回调

@property (nonatomic,copy)dispatch_block_t blockAction; // 点击事件回调

回调值

__weaktypeof(self) weakSelf =self;

vc.v= ^(NSString*str){

weakSelf.textStr=str;

};

//有了atomic来保证基本的原子性还是没有达到线程安全的,调用时需要把Block先赋值给本地变量,以防止Block突然改变。即便是先判断了Block属性不为空,在调用之前,一旦另一个线程把Block属性设空了,程序就会crash:

if(self.myBlock)

{

self.myBlock(123);

}

//先判断其是否为空,self.myBlock可能被另一个线程改为空,造成crash

//注意:atomic只会确保myBlock的原子性,这种操作本身还是非线程安全的

注:循环引用问题

在ARC下,由于__block抓取的变量一样会被Block retain,所以必须用弱引用才可以解决循环引用问题

__weaktypeof(self) weakSelf =self;

self.myBlock= ^()

{

};

--------》

对于weak:指明该对象并不负责保持delegate这个对象,delegate这个对象的销毁由外部控制。

对于strong:该对象强引用delegate,外界不能销毁delegate对象,会导致循环引用(Retain Cycles)

对于assing:也有weak的功效。但是网上有assign是指针赋值,不对引用计数操作,使用之后如果没有置为nil,可能就会产生野指针;而weak一旦不进行使用后,永远不会使用了,就不会产生野指针。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值