`
lizhuang
  • 浏览: 884449 次
  • 性别: 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无法发现的,所以要特别小心。
分享到:
评论

相关推荐

    iPhone开发、ObjectiveC_面试题目

    6、为什么很多内置类如UITableViewController的delegate属性都是assign而不是retain的? 7、定义属性时,什么情况使用copy,assign,和retain 8、autorelease的对象是在什么时候被release的? 9、这段代码有...

    IOS面试题归总

    IOS面试题归总 Object-C有多继承吗?没有的话用什么代替 Object-C有私有方法吗?私有变量呢 关键字const什么含义 关键字volatile有... 为什么很多内置的类,如TableViewController的delegate的属性是assign不是retain?

    jquery插件使用方法大全

    例如,使用了新的jQuery内部Ajax API就可以实现下面的代码了: // Assign handlers immediately after making the request, // and remember the jxhr object for this request var jxhr = $.ajax({ url: "example....

    IOS 常见的循环引用总结

    IOS 常见的循环引用总结 介绍: 循环引用,指的是多个对象相互引用时,使得引用形成一个环形,导致外部无法真正...Delegate是ios中开发中最常遇到的循环引用,一般在声明delegate的时候都要使用弱引用weak或者assign

    导航选项的菜单控件

    使用方法: 复制DOPNavbarMenu文件夹即可使用: 属性方法: @property (copy, nonatomic, readonly) NSArray *items; @property (assign, nonatomic, readonly) NSInteger maximumNumberInRow; @property ...

    实例讲解iOS应用开发中UIPickerView滚动选择栏的用法

    基础 1.UIPickerView 属性 数据源(用来告诉...@property(nonatomic,assign) id delegate;   是否要显示选中的指示器 代码如下: @property(nonatomic) BOOL showsSelectionIndicator;   一共有多少列 代

    ios 动态代理

    代理原理(自己的见解,下面的看不懂的读一读这三句话,再看) 拿到代理自己的类的引用, 并让它实现自己要调用的方法, 通过这个类的引用去调用被它实现的...@property (nonatomic, assign) id delegate; @end @implement

    【IOS一气呵成】之IAP集成:内购和内购恢复 DEMO

    #import #import #import @class RMIAPHelper;...@property(nonatomic,assign) id<RMIAPHelperDelegate> delegate; -(void)setup; -(void)destroy; -(void)buy:(NSString*)productId; -(void)restore; @end

    一个打分特效视图

    使用步骤: 1.导入视图: #import "DrawingView.h" 2.创建对象: drawingView = [[DrawingView alloc]initWithFrame:CGRectMake(25, 100, [[UIScreen mainScreen] bounds].size.width - 50, [[UIScreen ...

    自定义系统拍照功能

    p.delegate = self; UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:p]; [self presentViewController:nav animated:YES completion:NULL]; 2.拍完照之后的...

    详解iOS App中UIPickerView滚动选择栏的添加方法

    1.UIPickerView的宽度和高度是固定的,纵向是320216,横向是568162 2.属性: 代码如下: @property(nonatomic,...@property(nonatomic,assign)idUIPickerViewDelegate>delegate; (类似于UITableView) (BOOL)showsSel

Global site tag (gtag.js) - Google Analytics