`
zjjzmw1
  • 浏览: 1367703 次
  • 性别: Icon_minigender_1
  • 来自: 开封
社区版块
存档分类
最新评论

delegate 为什么用assign 而不用retain

    博客分类:
  • iOS
阅读更多
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永远不会被释放掉..就会释放不了..
分享到:
评论

相关推荐

    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面试题

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

    iPhone开发、ObjectiveC_面试题目

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

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

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

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

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

    iphone面试题秘籍 apple开发必备

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

    IOS面试题归总

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

    iOS笔试题041

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

    objective-c面试大全

    7. **sizeof和strlen的区别**:sizeof是运算符,用于获取类型或变量的大小(以字节为单位),而strlen是函数,用于计算字符串的长度(不包括末尾的空字符)。 8. **抽象类**:抽象类没有完全实现,通常包含至少一个...

    内存管理面试题1

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

    iOS面试题(有难有易)

    而assign通常用于基本数据类型或非指针对象(如C基本数据类型、结构体等)的简单赋值。assign不会增加对象的引用计数,也不会持有对象,因此适用于那些不需要管理引用计数的对象。 问题4探讨了delegate和...

    100家企业iOS面试题(下)

    #### 题目96:autorealease、retain、copy、assign分别代表什么? - **知识点**: - ** autorealease**:表示对象被放入自动释放池中。 - ** retain**:增加对象的引用计数。 - ** copy**:创建一个对象的深拷贝...

    ios的面试题目

    委托双方的属性通常声明为`assign`而非`retain`,以避免循环引用导致的内存泄漏。 8. **浅拷贝与深拷贝**: - 浅拷贝:只复制对象的引用,不复制对象本身。如果拷贝的对象被修改,原始对象也会受到影响。 - 深...

    Objectiov-c考试题

    13. **delegate属性**:通常为`assign`以防止循环引用,因为代理对象通常拥有被代理对象,若互相保留,可能导致内存泄漏。 14. **内存泄漏检查**:题目16分析了内存泄漏的可能性并提出了修改建议。 15. **基本数据...

    OC底层面试题1

    代理(Delegate)是Objective-C中一种常用的一对一通信设计模式,定义为@protocol,通常使用weak关键字避免循环引用。 最后,KVO(Key-value observing)是一种监听对象属性变化的方法,通过isa混写实现。当通过...

    iOS笔试题.docx

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

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

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

    ios object-c 面试试题 及答案

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

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

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

Global site tag (gtag.js) - Google Analytics