美文网首页
OC中为什么声明delegate用weak,声明block用co

OC中为什么声明delegate用weak,声明block用co

作者: liang1030 | 来源:发表于2024-12-08 13:42 被阅读0次

在Objective-C(OC)编程中,处理内存管理和避免循环引用是非常重要的。对于delegateblock,这两种常见的回调机制,分别使用weakcopy修饰符的原因与它们的内存管理特性有关。

为什么声明delegate用weak

  1. 避免循环引用

    • delegate通常用于实现一种设计模式,其中一个对象(比如一个视图控制器)需要向另一个对象(比如它的数据源或代理)发送消息。
    • 如果delegate属性被声明为strong(默认情况),并且两个对象相互持有对方(即A的delegate是B,同时B的某个属性也是A),这将导致循环引用,从而阻止两个对象被垃圾回收。
    • 使用weak修饰符可以避免这种循环引用,因为weak属性不会增加对象的保留计数。这样,只要没有其他strong引用指向该对象,它就可以被垃圾回收。
  2. 内存管理清晰

    • 使用weak可以清晰地表明这个属性不应该拥有其指向的对象,这有助于代码的可读性和维护性。

为什么声明block用copy

  1. 确保block在堆上

    • 在Objective-C中,block默认是在栈上分配的。如果block在栈上,并且它被另一个对象持有(比如作为属性),那么当栈帧被销毁时(比如方法执行完毕),block也会被销毁,这可能导致未定义行为(比如访问已销毁的内存)。
    • 使用copy修饰符可以将block从栈复制到堆上,确保block的生命周期独立于创建它的栈帧。
  2. 避免栈上的block被意外修改

    • 栈上的block可能会因为栈帧的变化(比如局部变量被修改)而被意外修改。将block复制到堆上可以确保它的内容不会被意外改变。
  3. ARC下的优化

    • 在ARC(自动引用计数)下,copy一个block实际上会调用block_copy函数,这个函数会检查block是否已经在堆上。如果是,它只是简单地增加保留计数;如果不是,它才会将block从栈复制到堆上。这意味着使用copy不会造成不必要的性能开销。

总结

  • 使用weak修饰delegate属性是为了避免循环引用,确保内存管理的正确性。
  • 使用copy修饰block属性是为了确保block在堆上分配,避免因为栈帧销毁而导致的未定义行为,并保护block的内容不被意外修改。

这两种做法都是基于Objective-C的内存管理规则和最佳实践,有助于编写健壮、可维护的代码。

相关文章

  • swift 调用 OC中的block

    OC中声明block; OC中实现block swift中实现

  • OC中assign,weak,strong,retain,cop

    OC中用@property声明属性时可以用assign,weak,strong,copy,retain来修饰,这些...

  • ios基础

    OC是动态运行时语言 是什么意思? MVC, MVVM, MVP delegate代理 为什么 用 weak?防止...

  • iOS内存泄露可能出现的问题和解决工具

    内存防止 1、Block,使用_weak声明一个代替self的新变量代替原先的self 自定义的block用cop...

  • block笔记

    1.我在一个类中声明了一个block属性:a类 定义如下: 这里用的是weak修饰的,表示我不会将block从本身...

  • Swift delegate

    ARC 中,对于一般的 delegate,在声明中将其指定为 weak,在这个 delegate 实际的对象被释放...

  • block的声明以及使用的底层实现

    1. 在OC中block的声明->赋值->使用 2. block的底层实现 3. 总结 声明:参考文章https:...

  • Swift - Delegate

    在ARC中,对于一般的delegate,我们会在声明中将其指定为weak,在这个delegate实际的对象被释放的...

  • JSPatch下发笔记2

    原代码 JS代码 注意:1.block中的self要在block外面声明成:_ _weak typeof(self...

  • 内存优化

    cell重用机制 循环引用delegate代理声明使用weak修饰NSTimerblock 其他NSNotific...

网友评论

      本文标题:OC中为什么声明delegate用weak,声明block用co

      本文链接:https://www.haomeiwen.com/subject/xbkcsjtx.html