美文网首页
@Property assign 之旅

@Property assign 之旅

作者: 三月木头 | 来源:发表于2019-12-24 01:28 被阅读0次

之前去一家二线互联网面试,面试官问了一下assign、weak区别是什么?
内心暗喜。勇敢的说道:
weak修饰对象,weak修饰属性的时候,同时会生成一个weakHash表,将weak对象的&p地址,同这个weak对象建立一一对应关系。当weak对象引用计数为0的时候,对象被释放,同时根据建立的对应关系将此对应&p地址设置为nil。这样做的好处是,对象被释放后,调用其方法不会导致crash。
assign 修饰的基础数据类型,修饰个int啥的。如果修饰对象,万一对象被释放,但是内存&p并不为空,调用会引起crash,也就是野指针。答完后心里有些小喜。

面试官接着问道:
那assign只能修饰基础数据类型吗?
答:
不是,也是可以修饰对象的。
问:
那既然可以修饰对象,那什么情况下可以使用assign修饰对象吗?
答:这个通常使用weak就可以
问:可是weak需要建表,性能没有assign高,为了性能考虑,什么情况下assign可以修饰对象呢?
(⊙o⊙)…
其实心里想,肯定是修饰程序存活期间不被释放的对象呀。一直憋着没有说出口,因为我想不出什么情况下的对象能一直不被释放。

今天偶然机会看到一段视频讲内存管理内容。其中讲到一段代码
NSString *str0 = @"123456";
请问上面代码是存在内存什么位置?
他回答到:是存在静态区,所以这个对象一直存在。
我赶紧打印了一下代码查看了一下&p地址,发现真的。。。
2019-12-24 01:08:50.055467+0800 testProperty[7111:552337] str0:0x10fb92020
根据指针第三位的内存原理 6堆7栈 1静态 不难发现,真的是静态区。至此恍然大悟,原理上次面试官的问题的assign可以在此处修饰。

也就是assign可以修饰存在静态区的对象,具体是什么呢?比如
NSString *str = @"12345";

相关文章

网友评论

      本文标题:@Property assign 之旅

      本文链接:https://www.haomeiwen.com/subject/pwqxoctx.html