1.什么情況使用weak關(guān)鍵字,相比assign有什么不同?
什么情況下使用weak關(guān)鍵字?
1.在ARC中,在有可能出現(xiàn)循環(huán)引用的時(shí)候,往往要通過(guò)讓其中一端使用weak來(lái)解決,比如delegate代理
2.自身已經(jīng)對(duì)它進(jìn)行一次強(qiáng)引用,沒(méi)有必要再?gòu)?qiáng)引用一次,此時(shí)也會(huì)使用weak,自定義IBOutlet控件屬性一般也使用weak,當(dāng)然也可以使用strong
不同點(diǎn):
1.weak此特質(zhì)表明該屬性定義了一種"非擁有關(guān)系"。為這種屬性設(shè)置新值時(shí),設(shè)置方法既不保留新值,也不釋放舊值.此特質(zhì)同assign類(lèi)似,然而在屬性所指的對(duì)象遭到摧毀時(shí),屬性值也會(huì)清空(nil out)。而assign的“設(shè)置方法”只會(huì)執(zhí)行針對(duì)"純量類(lèi)型"(例如 CGFloat 或NSInteger)的簡(jiǎn)單賦值操作。
2.assigin可以使用非OC對(duì)象,而weak必須使用OC對(duì)象。
2.這個(gè)寫(xiě)法會(huì)出什么問(wèn)題:
@Property(copy) NSMutableArray *array
兩個(gè)問(wèn)題:
1.添加,刪除,修改數(shù)組內(nèi)的元素的時(shí)候,程序會(huì)因?yàn)檎也坏椒椒ǘ紳?因?yàn)閏opy就是復(fù)制一個(gè)不可變NSArray的對(duì)象,2.使用了atomic屬性會(huì)嚴(yán)重影響性能,因?yàn)閷傩阅J(rèn)的修飾符就是atomic。
在iOS開(kāi)發(fā)中一般都會(huì)使用nonatomic屬性修飾,但在開(kāi)發(fā)Mac OS X程序中使用atomic修飾屬性通常不會(huì)有性能瓶頸.
3.Category和extension的區(qū)別
- 分類(lèi)有名字,類(lèi)擴(kuò)展沒(méi)有分類(lèi)名字,是一種特殊的分類(lèi)。
- 分類(lèi)只能擴(kuò)展方法(屬性僅僅是聲明,并沒(méi)有實(shí)現(xiàn)),類(lèi)擴(kuò)張可以擴(kuò)展屬性,成員變量和方法.
4.define和const常量有聲明區(qū)別?
- define在預(yù)處理階段進(jìn)行替換,const常量在編譯階段使用.
- 宏不做類(lèi)型檢查,僅僅是進(jìn)行替換,const常量有數(shù)據(jù)類(lèi)型,會(huì)進(jìn)行類(lèi)型判斷
- define不能調(diào)試,const常量可以調(diào)試
- define定義的常量在替換后運(yùn)行過(guò)程中會(huì)不斷的占用內(nèi)存,而const定義的常量存儲(chǔ)在數(shù)據(jù)段中只有一份copy,效率更高.
- define可以定義一些簡(jiǎn)單的函數(shù),而const不可以
5.block和weak修飾符的區(qū)別?
- __block不管是在ARC還是MRC模式下都可以使用,可以修飾對(duì)象,也可以修飾基本數(shù)據(jù)類(lèi)型.
- __weak只能在ARC模式下使用,只能修飾(NSString),不能修飾基本數(shù)據(jù)類(lèi)型
- block修飾的對(duì)象可以在block中被重新賦值,weak修飾的對(duì)象不可以
6.static關(guān)鍵字的作用
- 函數(shù)(方法)體內(nèi)static變量的作用返回為該函數(shù)體,該變量的內(nèi)存只被分配一次,因此其值在下次調(diào)用的時(shí)候仍然維持上次的值.
- 在模塊內(nèi)的static全局變量可以被模塊內(nèi)的所有函數(shù)調(diào)用,不能被模塊外的函數(shù)調(diào)用.
- 在模塊內(nèi)的 static 函數(shù)只可被這一模塊內(nèi)的其它函數(shù)調(diào)用,這個(gè)函數(shù)的使用范圍被限制在聲明 它的模塊內(nèi);
- 在類(lèi)中的 static 成員變量屬于整個(gè)類(lèi)所擁有,對(duì)類(lèi)的所有對(duì)象只有一份拷貝;
- 在類(lèi)中的 static 成員函數(shù)屬于整個(gè)類(lèi)所擁有,這個(gè)函數(shù)不接收 this 指針,因而只能訪問(wèn)類(lèi)的static 成員變量
7.堆和棧的區(qū)別
- 從管理方式來(lái)講
對(duì)于棧來(lái)講,是由編譯器自動(dòng)管理,無(wú)需我們手工控制;
對(duì)于堆來(lái)說(shuō),釋放工作由程序員控制,容易產(chǎn)生內(nèi)存泄露(memory leak) - 從申請(qǐng)大小大小方面講
??臻g比較小
堆控件比較大 - 從數(shù)據(jù)存儲(chǔ)方面來(lái)講
棧空間中一般存儲(chǔ)基本類(lèi)型,對(duì)象的地址
堆空間一般存放對(duì)象本身,block的copy等
8.@property的本質(zhì)是什么?
- @property其實(shí)就是在編譯階段有編譯器自動(dòng)幫我們生成ivae成員變量,getter方法,setter方法