`
lizhuang
  • 浏览: 899205 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

delegate为何使用assign

 
阅读更多
assing是为了防止交叉引用..比如..有3个类....A..B..C.. 我在A里面..创建B...B里面有创建C....并设定C的delegate=self(也就是B).. 如果C里面的delegate是retain...那么B的retain就会是+2(A类创建时+1) 这时候..如果我在A里面release了B...那么B的retain就不会是0(因为C的delegate是retain的)... 也就是说B永远不会被释放掉..就会释放不了..

循环引用
所有的引用计数系统,都存在循环应用的问题。例如下面的引用关系:
对象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 声明后的对象会更改引用计数,那么每次被引用,引用计数都会+1,释放后就会-1,即使这个对象本身释放了,只要还有对象在引用它,就会持有,不会造成什么问题,只有当引用计数为 0 时,就被 dealloc 析构函数...

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

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

    iphone面试题秘籍 apple开发必备

    4. **UITableViewController的delegate属性为何设置为assign** - **原因**:避免循环引用。如果设置为`retain`,则UITableViewController和其delegate之间会产生相互引用,导致内存泄漏。 5. **KVC与KVO的概念及...

    内存管理面试题1

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

    OC非正式协议实现代理功能

    objc_setAssociatedObject(self, @selector(delegate), self.delegate, OBJC_ASSOCIATION_ASSIGN); } - (void)someTaskFinished { if ([self.delegate respondsToSelector:@selector(didFinishTask:)]) { [self....

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

    12. Objective-C的实例变量的声明和内存管理:在Objective-C中,实例变量默认为assign属性,对于对象类型的变量,应使用retain或copy属性来控制内存。 13. NSDictionary:NSDictionary是一个不可变字典,可以通过...

    iphone面试题

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

    实体类传值

    例如,创建一个名为`User`的实体类: ```objc // Objective-C @interface User : NSObject @property (nonatomic, strong) NSString *name; @property (nonatomic, assign) NSInteger age; @end @implementation ...

    iOS面试题(有难有易)

    此外,使用NSThread的sleepUntilDate:方法进行延时操作并不是一个好的实践,通常推荐使用更高级的并发方法,如GCD或NSOperation。 以上内容涉及了iOS开发的多个方面,包括开发工具、内存管理、多线程编程、设计模式...

    ios object-c 面试试题 及答案

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

    iOS笔试题041

    7. **TableView的delegate属性设置为assign的原因**: - 设置为`assign`是为了避免循环引用。TableView的代理通常是它的父ViewController,如果设置为`retain`,两者会互相持有对方,可能导致内存泄漏。 8. **属性...

    iPhone开发、ObjectiveC_面试题目

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

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

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

    IOS 常见的循环引用总结

    在ARC(Automatic Reference Counting)环境下,推荐使用`weak`,因为它会在`delegate`对象被释放时自动设置为`nil`,避免产生悬空指针。而在MRC(Manual Reference Counting)环境下,由于没有自动释放机制,我们...

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

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

    EatDelegate.zip

    本文将深入探讨iOS基础代理的使用,以" EatDelegate.zip "为例,通过一个生动的“人被狗代理”的场景来阐述这一概念。 首先,代理模式在iOS中的应用广泛,如UITableView的DataSource和Delegate、UIWebView的...

    objective-c面试大全

    1. **对象间的交互**:Objective-C中,对象间的通信主要通过消息传递机制实现,包括代理模式(Delegate)、观察者模式(Observer)、Blocks以及App Delegate。代理允许一个对象向另一个对象发送通知,观察者模式用于...

    iOS之协议protocol

    协议主要用于类之间的通信,尤其在处理 delegate 模式时,它使得对象间能以一种灵活的方式进行交互。本教程将深入探讨协议的使用方法、使用场景以及其在类之间的通信规则。 首先,让我们了解协议的基本定义。协议在...

Global site tag (gtag.js) - Google Analytics