1.可變與不可變數(shù)組的關(guān)鍵字修飾
@property(nonatomic,strong) NSArray *array1;
@property(nonatomic,copy) NSArray *array2;
@property(nonatomic,strong) NSMutableArray *array3;
@property(nonatomic,copy) NSMutableArray *array4;
1,array 使用strong修飾不可變數(shù)組時,這時外部使用可變數(shù)組賦值時,會改變它的值會出現(xiàn)一些不必要的麻煩(當傳入的array是可變對象且發(fā)生改變時玲昧,會導致屬性跟著改變造成數(shù)據(jù)錯亂殖属,如果可以確定傳入的數(shù)據(jù)是不可變的,可以用strong齐唆。).所以NSArray最好用copy去修飾,可變數(shù)組賦值給不可變數(shù)組,本質(zhì)上只是把數(shù)組的元素傳過去,并沒有發(fā)生大家所說的深copy的實現(xiàn),因為本質(zhì)上數(shù)組的內(nèi)存的地址沒有變.
2, NSMutableArray用copy的話,會copy成NSArray 而不是NSMutableArray,傳入一個array后,查元素會crash,所以最好用strong去修飾
2.NSString為什么要用copy關(guān)鍵字律秃,如果用strong會有什么問題爬橡?
一般情況下,不可變對象(NSString棒动,NSArray糙申,NSDictionary等)使用copy修飾,可變對象(NSMutableString船惨,NSMutabeArray柜裸,NSMutableDictionary等)使用strong修飾;
不可變對象可以接受子類對象粱锐,也就是說NSString可以接受NSMutableString疙挺,如果使用strong修飾,當傳入的string是可變對象且發(fā)生改變時怜浅,會導致屬性跟著改變造成數(shù)據(jù)錯亂铐然,如果可以確定傳入的數(shù)據(jù)是不可變的,可以用strong恶座。
注意搀暑,可變對象一定要用strong修飾,因為使用copy修飾后對象是不可變的奥裸,如果這時對可變對象進行修改會導致崩潰.
3.block相關(guān)
block的本質(zhì)是一個指針結(jié)構(gòu)體,
可能存放在3個地方:代碼區(qū)(全局區(qū))险掀、堆區(qū)、棧區(qū)(ARC情況下回自動拷貝到堆區(qū)湾宙、因此ARC下只有兩個地方:代碼區(qū)和堆區(qū))樟氢。如果不是ARC則存放在棧區(qū),所在函數(shù)執(zhí)行完畢就回釋放侠鳄,想再外面調(diào)用需要用copy指向它埠啃,這樣就拷貝到了堆區(qū),strong屬性不會拷貝伟恶、會造成野指針錯區(qū)碴开。
Block結(jié)構(gòu)體內(nèi)部的isa指針是指向_NSContreteStackBlock的,其實這只是其中的一種,分別還有_NSContreteGlobalBlock 和 _NSContreteMallocBlock,block根據(jù)在內(nèi)存中的位置分為三種:NSGlobalBlock潦牛,NSStackBlock眶掌,NSMallocBlock。block中沒有用到局部變量會初始化為NSConcreateGlobalBlock巴碗,如果用到局部變量朴爬,在MRC中會初始化為NSConcreateStackBlock,ARC中會初始化為NSConcreateMallocBlock橡淆。block作為屬性時使用copy修飾以保證MRC下將block拷貝到堆中召噩,ARC下不使用copy修飾也會自動拷貝到堆中