为什么代理属性设置成assign为了防止生成保留环来

循环引用

全部的引用计数系统, 都存在循环应用的问题, 比如以下的引用关系:

1. 对象a创建并引用到了对象b

2. 对象b创建并引用到了对象c

3. 对象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无法发现的,所以要特别小心。

时间: 2024-10-15 01:28:38

为什么代理属性设置成assign为了防止生成保留环来的相关文章

wpf 通过为DataGrid所绑定的数据源类型的属性设置Attribute改变DataGrid自动生成列的顺序

环境Win10 VS2019 .Net Framework4.8 在wpf中,如果为一个DataGrid绑定到一个数据源,默认情况下DataGrid会为数据源类型的每个属性生成一个列(Column)对象.但并没有简单的方式用来控制列的生成顺序. DataGrid提供了两个与自动生成列有关的事件,分别是: AutoGeneratingColumn 会在为每个属性创建列时引发,引发时列已经创建完毕,在这个事件中可以: 通过e.Column获取已经创建的列对象,并对其进行修改. 通过将e.Cancel

c3p0私有属性checkoutTimeout设置成1000引发的调试错误:

checkoutTimeout设置成1000引发的调试错误: org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException: ### Error updating database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not

Excel2007给表格设置成只读加密属性 让他人无法修改

在制作一些报表和公司的表格时,我们常常需要给Excel表格加密或者设置成只读属性来加以防护这些重要表格.给表格加密可以预防他人无法打开表格,只有通过输入正确的密码后才可以正常打开.设置成只读的话,可以预防他人修改文件,只能读取表格,除非输入正确的密码后才可以修改表格中内容.Excel加密技巧Word联盟前面已经讲过了,今天来给大家讲解下Excel2007中如何给表格设置成只读属性! ①在Excel2007中单击“Office按钮”,在弹出菜单栏中选择“另存为”中的“Excel工作薄”命令: ②在

TextView设置成仅仅读

TextView设置成仅仅读 方法一:代理 - (BOOL)textViewShouldBeginEditing:(UITextView *)textView { return NO; } 方法二:设置属性 textView.editable = NO;

自定义类属性设置及setter、getter方法的内部实现

属性是可以说是面向对象语言中封装的一个体现,在自定义类中设置属性就相当于定义了一个私有变量.设置器(setter方法)以及访问器(getter方法),其中无论是变量的定义,方法的声明和实现都是系统自动生成的并且经过了相应地内存管理和优化,无需开发者操心. 属性的声明: 属性一般定义在类的接口,或类的延展内,并且放在方法的声明之前,成员变量的声明之后.属性关键字是@property,括号内的是属性的属性,然后是变量的类型和名字,属性的定义一般分为两种情况,一种是非对象类型的变量,如int整型,使用

TextView设置成只读

TextView设置成只读 方法一:代理 - (BOOL)textViewShouldBeginEditing:(UITextView *)textView { return NO; } 方法二:设置属性 textView.editable = NO; 版权声明:本文为博主原创文章,未经博主允许不得转载.

IOS变量的property属性设置和意义总结

最近有机会对IOS的property属性进行了一个全面的了解和总结: IOS 的@property和@synthesize帮我们轻易的生成对象的getter和setter方法来完成对对象的赋值和访问.但是如果我们如果要动态设置对象的getter和setter方法可以使用@property和@dynamic组合.对象访问方法property的属性设置非常多,诸如:atomic和nonatomic,readwrite和readonly,retain,assign和copy,strong和weak.

将Win7笔记本设置成WiFi热点(无线路由器)

查看是否能启动WiFi网卡: S1:运行cmd命令,打开命令提示符窗口(以管理员身份运行). S2:在命令行输入:netsh wlan show drivers. 若"支持的承载网络"后为"是",则可以启用虚拟wifi网卡:"否"则不可以. 启用虚拟WiFi网卡: S1:在命令行中输入:netsh wlan set hostednetwork mode=allow ssid=用户名key=密码(mode:是否启用虚拟WiFi网卡,allow为启用

js+jquery动态设置/添加/删除/获取元素属性的两种方法集锦对照(动态onclick属性设置+动态title设置)

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html140/strict.dtd"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"/> <title>