`

delegate 用 assign 而不使用 retain

阅读更多

http://blog.csdn.net/diyagoanyhacker/article/details/6591593

循环引用
所有的引用计数系统,都存在循环应用的问题。例如下面的引用关系:

对象a创建并引用了对象b.对象b创建并引用了对象c.对象c创建并引用了对象b.

这时候b和c的引用计数分别是2和1。当a不再使用b,调用release释放对b的所有权,因为c还引用了b,所以b的引用计数为1,b不会被释放。b不释放,c的引用计数就是1,c也不会被释放。从此,b和c永远留在内存中。
这种情况,必须打断循环引用,通过其他规则来维护引用关系。比如,我们常见的delegate往往是assign方式的属性而不是retain方式的属性,赋值不会增加引用计数,就是为了防止delegation两端产生不必要的循环引用。如果一个UITableViewController 对象a通过retain获取了UITableView对象b的所有权,这个UITableView对象b的delegate又是a, 如果这个delegate是retain方式的,那基本上就没有机会释放这两个对象了。自己在设计使用delegate模式时,也要注意这点。
因为循环引用而产生的内存泄露也是Instrument无法发现的,所以要特别小心。
一些和内存管理相关的有用内容:

分享到:
评论

相关推荐

    IOS中(assign,retain,copy,weak,strong)的区别以及nonatomic的含义

    retain 与 assign 相对,我们要解决对象被其他对象引用后释放造成的问题,就要用 retain 来声明。retain 声明后的对象会更改引用计数,那么每次被引用,引用计数都会+1,释放后就会-1,即使这个对象本身释放了,只要...

    iOS开发之详谈属性设置readwrite、readonly、retain、copy、assign、nonatomic

    - 对于需要保持对象生命周期的属性,如`UIViewController`的`delegate`,应使用`retain`。 - 对于不可变对象(如`NSString`),通常使用`copy`以防止对象被外部修改。 - 对于性能敏感的场景,可选择使用`...

    iPhone开发、ObjectiveC_面试题目

    6. `UITableViewContoller`的`delegate`属性设为`assign`而不是`retain`,是为了防止循环引用,因为`delegate`通常也是控制器,如果互相持有,会导致内存泄露。 7. `copy`用于创建对象的副本,确保属性的独立性;`...

    IOS软件工程师笔试题(全选择题)【0-1年经验】.pdf

    9. 实例变量和属性的内存管理:在Objective-C中,实例变量的内存管理可以通过属性的setter方法来控制,比如使用retain或assign关键字。 10. Objective-C中的方法命名:Objective-C中方法可以带有返回值类型,并且...

    iphone面试题

    **问题4**: 为什么很多内置类如`UITableViewController`的`delegate`属性都是`assign`而不是`retain`的? - **答案解析**: 使用`assign`而非`retain`是为了避免循环引用的问题。如果`delegate`属性使用`retain`,...

    ios开发ios基础开发面试题.txt

    为什么TableViewController的delegate常用assign而不是retain? - **原因**:为了避免循环引用问题,通常使用`assign`。 - **循环引用**:当两个对象互相持有对方的强引用时,会导致内存泄漏。 #### 11. 何时使用...

    iphone面试题秘籍 apple开发必备

    1. **Objective-C中的内存管理原则**:遵循谁创建谁释放的原则,即使用`alloc`、`copy`、`new`、`retain`创建的对象应使用`release`或`autorelease`来释放。 2. **内存泄漏常见场景及解决办法**:避免忘记释放对象...

    内存管理面试题1

    1. 代理(delegate)循环引用:通常使用weak或assign修饰delegate,防止强引用循环。 2. NSTimer循环引用:使用weakSelf或在适当时候释放定时器。 3. Block循环引用:在block内部使用weakSelf,但需要注意weakSelf在...

    iOS面试题(有难有易)

    delegate模式需要明确知道委托者,而notification模式则不需要。 问题5询问了CollectionView与tableview的区别。CollectionView和tableview都是用来展示列表数据的控件,但它们在展示方式和灵活性上有所区别。...

    IOS面试题归总

    内置类如`UITableViewDataSource`的`delegate`属性通常设为`assign`,因为如果设为`retain`,可能导致循环引用(Retain Cycle),进而导致内存泄漏。 了解这些知识点对于iOS开发者来说至关重要,它们涵盖了...

    objective-c面试大全

    `retain`、`assign`和`copy`分别表示不同的内存管理策略,其中`retain`会增加对象的引用计数,`assign`仅做赋值,不涉及内存管理,`copy`用于深拷贝对象。 11. **控制类的作用**:在iPhone开发中,控制器类如...

    iOS笔试题041

    8. **属性的copy、assign、retain的使用**: - **copy**:用于复制并拥有对象,如NSString、NSMutableString、Block等,确保对象的独立性。 - **assign**:用于非Objective-C对象,如基本数据类型,或防止循环引用...

    ios的面试题目

    - `#include` 是C/C++中的预处理器指令,没有防止头文件重复包含的功能,因此在Objective-C中通常不使用。 3. **Category与类扩展(Extension)**: - Category是扩展已有类功能的一种方式,无需继承。它可以添加...

    iOS内存管理方面的面试题汇总

    2. 对于代理(delegate)使用`weak`或`assign`,避免强引用循环。 3. NSTimer的循环引用可通过在不再需要定时器时调用`invalidate`并设为`nil`来解决。 4. 对于Block引起的循环引用,可以使用`__weak`修饰外部对象,...

    Objectiov-c考试题

    9. **属性设置**:题目10至12讨论了`assign`、`retain`和`copy`属性关键字的使用,理解其对内存管理的影响是必要的。 10. **self与super的使用**:`self`代表当前对象,`super`用于调用父类的方法。 11. **dealloc...

    ios object-c 面试试题 及答案

    属性的类型通常使用`assign`,除非对象需要保留对代理的强引用,这时使用`strong`。如果代理遵循协议并需要在协议方法中修改自身,可能会使用`weak`来防止循环引用。`copy`通常用于需要保持原始数据不变的情况,不...

    iOS笔试题.docx

    11. 大多数内置类如`UITableViewController`的`delegate`属性设置为`assign`,因为代理通常不拥有被代理的对象,避免循环引用。 12. `copy`用于深拷贝,确保拷贝的是对象的一个独立副本;`assign`是浅拷贝,只复制...

    OC底层面试题1

    3. 引用计数:retain(或strong)用于增加对象的引用计数,assign常用于基本数据类型,可能导致悬垂指针问题。weak不会增加引用计数,当对象释放后,weak指针会自动设为nil。copy分为浅拷贝和深拷贝,浅拷贝仅复制...

    8.1《iOS开发笔试题600道-笔试手写篇》(2).pdf

    #include不提供防止重复包含同一头文件的机制,而#import通过使用宏定义来避免头文件被重复包含。通常情况下,当包含框架的头文件时,推荐使用#import。 ```objective-c #import ``` 以上是针对给定文件部分内容...

Global site tag (gtag.js) - Google Analytics