《iOS之一起进大厂》系列-iOS属性关键字和相关的面试题

收录:空杯子

前面的话


属性关键字是iOS开发中的基础。 基础往往容易被忽略,但是细节决定成败。 如果面试时,忽然来一发属性关键字相关的问题,回答的不好,那给面试官的印象就会差很多,成为了木桶短板的一个。可能前面回答的好建立的优势就没了。

开始面试


我正在会议室略有紧张的等待面试,忽然看到一个穿着格子衬衫,大腹便便的中年男子拿着简历向我走来, 我看着他头上快要绝顶的头发,心想这肯定是个iOS开发技术牛逼闪闪的老前辈。
还好看过《iOS之一起进大厂》系列,我的知识很渊博,基础很牢固,不慌。刚紧张到提到嗓子眼的心,又按下去了。淡定从容,一点都不虚好伐,就是这么自信淡定。

我什么时候也能变成那样厉害的高手

变强了

面试官:


小伙子,看你简历 ,你对开发基础了解的很透彻啊,那咱们今天就聊聊属性关键字把。 你对属性关键字怎么理解?

属性关键字可以分为三种类型:


  • 读写权限的类型: readonly ,readwrite
  • 原子类 : atomic ,nonatomic
  • 引用计数 : retain/strong/copy,assign/unsafe_unretained,weak

读写权限的类型: readonly ,readwrite

  • readwrite 是可读可写特性;会自动生成getter方法和setter方法
  • readonly 是只读特性 只会生成getter方法 ,不会生成setter方法

原子类: atomic nonatomic


atomic是保证赋值和获取是线程安全的。 这里说的是对成员属性的直接赋值和获取,并代表操作和访问。 对于atomic的属性,系统生成的 getter/setter 会保证 get、set 操作的完整性,不受其他线程影响。

retain关键字


只有在MRC的环境下使用。 retain引起对象的引用计数加1, release引起引用计数减1,当引用计数为0时,dealloc函数被调用,内存被回收。

那你说说strong和weak的区别是?


strong 表示指向并拥有该对象。其修饰的对象引用计数会加1.该对象只要引用计数不为0则不会被销毁。当然强制将其置为nil也可以销毁它。 weak 表示指向但不拥有该对象。其修饰的对象引用计数不会增加。无需手动设置,该对象会自行在内存中销毁。

如何理解的atomic的线程安全呢,有没有什么隐患?


atomic对一个数组,进行赋值或获取,是可以保证线程安全的。但是如果进行数组进行操作,比如给数据加对象或移除对象,是不在atomic的保证范围。

strong 和weak的区别?


strong 表示指向并拥有该对象。其修饰的对象引用计数会加1.该对象只要引用计数不为0则不会被销毁。当然强制将其置为nil也可以销毁它。 weak 表示指向但不拥有该对象。其修饰的对象引用计数不会增加。无需手动设置,该对象会自行在内存中销毁。

assign 和weak的区别有哪些?


assign修饰基础数据类型,int, BOOL
assign修饰对象类型,不改变对象的引用计数。
assign 会产生悬垂指针, assign 的对象被释放之后,对象指针还是会指向原来的地址,会产生悬垂指针 ,导致程序内存泄露和程序崩溃。
weak不改变修饰对象的引用计数
所指向的对象在被释放后自动设置为 nil.
他们的区别:
1、assign可以修饰对象和基本数据类型, weak只修饰对象
2、assign 所修饰的对象被释放后,还会指向原对象内存地址。weak 所修饰的对象被废弃之后,weak 所修饰对象会被设置为nil。
但是他们有一个共同点,他们都不会改变修饰对象的引用计数。

copy关键字影响了对象的可变和不可变属性吗?


可变对象(mutable)copy和mutableCopy都是深拷贝 不可变对象(immutable)的copy是浅拷贝,mutableCopy是深拷贝 copy方法返回的都是不可变对象,若被拷贝对象是可变对象,返回的也是不可变对象。 例子解析如下:

浅拷贝和深拷贝的区别?


浅拷贝只是对 内存地址的复制,两个指针指向同一个地址,增加被拷贝对象的引用计数,没有发生新的内存分配。
深拷贝:目标对象指针和源对象指针,指向两片内容相同的内存空间。
2个特点:不会增加被拷贝对象的引用计数,产生了新内存分配,出现了2块内存。
总结区别:
浅拷贝增加引用计数,不产生新的内存。
深拷贝不增加引用结束,会新分配内存

NSMutableArray用copy修饰会出现什么问题?


出现调用可变方法不可控问题,会导致程序崩溃。 具体原因如下:
给Mutable 被声明为copy修饰的属性赋值, 过程描述如下:
1.如果赋值过来的是NSMutableArray对象,会对可变对象进行copy操作,拷贝结果是不可变的,那么copy后就是NSArray
2.如果赋值过来的是NSArray对象, 会对不可变对象进行copy操作,拷贝结果仍是不可变的,那么copy之后仍是NSArray。
所以不论赋值过来的是什么对象,只要对NSMutableArray进行copy操作,返回的对象都是不可变的。
那原来属性声明的是NSMutableArray,可能会调用了add或者remove方法,拷贝后的结果是不可变对象,所以一旦调用这些方法就会程序崩溃(crash)

MRC下如何重写retain修饰变量的setter方法?



这里关键点在于,如果恰好设置的是原来的对象,不做判断的话,就会导致把自己对象给释放了,会导致程序访问异常。所以需要先做判断。

weak属性修饰的变量,如何实现在变量没有强引用后自动置为 nil ?


runtime 维护了一个weak_table_t 弱引用表 ,用于存储指向某一个对象的所有weak指针。weak表其实是一个哈希表,
key是所指对象的地址,value是weak指针的地址的数组。
在对象回收的时候,根据对象的地址将所有weak指针地址的数组,遍历数组把其中的数据置为nil

__weak 和 _Unsafe_Unretain 的区别?


weak 修饰的指针变量,在指向的内存地址销毁后,会在 Runtime 的机制下,自动置为 nil。
_Unsafe_Unretain不会置为 nil,容易出现 悬垂指针,发生崩溃。但是 _Unsafe_Unretain 比 __weak 效率高。

坚持看到这里的同学,你们个个都是人才,我好喜欢。


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容