1雅潭、#import 跟 #include 有什么區(qū)別久信,@class呢也物,#import<> 跟 #import"" 有什么區(qū)別兴枯?
答:
(1) #import是Objective-C導(dǎo)入頭文件的關(guān)鍵字确虱,#include是C/C++導(dǎo)入頭文件的關(guān)鍵字,使用 #import頭文件會自動只導(dǎo)入一次,不會重復(fù)導(dǎo)入斯够。
(2) @class 告訴編譯器某個類的聲明,當(dāng)執(zhí)行時,才去查看類的實現(xiàn)文件读规,可以解決頭文件的相互包含抓督。
(3) #import<> 用來包含系統(tǒng)的頭文件,#import"" 用來包含用戶頭文件束亏。
2铃在、frame 和 bounds 有什么不同?
答:
frame指的是:該view在父view坐標(biāo)系統(tǒng)中的位置和大小碍遍。(參照點是父view的坐標(biāo)系統(tǒng))
bounds指的是:該view在本身坐標(biāo)系統(tǒng)中的位置和大小定铜。(參照點是本身坐標(biāo)系統(tǒng))
3、屬性關(guān)鍵字 readwrite怕敬,readonly宿稀,assign,retain赖捌,copy祝沸,nonatomic 各是什么作用,在那種情況下用越庇?
答:
1). readwrite 是可讀可寫特性罩锐。需要生成getter方法和setter方法。
2). readonly 是只讀特性卤唉。只會生成getter方法涩惑,不會生成setter方法,不希望屬性在類外改變桑驱。
3). assign 是賦值特性竭恬。setter方法將傳入?yún)?shù)賦值給實例變量;僅設(shè)置變量時,assign用于基本數(shù)據(jù)類型。
4). retain(MRC)/strong(ARC) 表示持有特性熬的。setter方法將傳入?yún)?shù)先保留痊硕,再賦值,傳入?yún)?shù)的retaincount會+1押框。
5). copy 表示拷貝特性岔绸。setter方法將傳入對象復(fù)制一份,需要完全一份新的變量時橡伞。
6). nonatomic 非原子操作盒揉。決定編譯器生成的setter和getter方法是否是原子操作,atomic表示多線程安全兑徘,一般使用nonatomic刚盈,效率高。
4挂脑、怎么用 copy 關(guān)鍵字藕漱?
答:
1). NSString欲侮、NSArray、NSDictionary 等等經(jīng)常使用copy關(guān)鍵字谴分,是因為他們有對應(yīng)的可變類型:NSMutableString、NSMutableArray镀脂、NSMutableDictionary牺蹄;
2). block 也經(jīng)常使用 copy 關(guān)鍵字。
說明:block 使用 copy 是從 MRC 遺留下來的“傳統(tǒng)”,在 MRC 中,方法內(nèi)部的 block 是在棧區(qū)的,使用 copy 可以把它放到堆區(qū).在 ARC 中寫不寫都行:對于 block 使用 copy 還是 strong 效果是一樣的薄翅,但寫上 copy 也無傷大雅沙兰,還能時刻提醒我們:編譯器自動對 block 進行了 copy 操作。如果不寫 copy 翘魄,該類的調(diào)用者有可能會忘記或者根本不知道“編譯器會自動對 block 進行了 copy 操作”鼎天,他們有可能會在調(diào)用之前自行拷貝屬性值。這種操作多余而低效暑竟。
5斋射、什么情況使用 weak 關(guān)鍵字,相比 assign 有什么不同但荤?
答:
1).在 ARC 中,在有可能出現(xiàn)循環(huán)引用的時候,往往要通過讓其中一端使用 weak 來解決,比如: delegate 代理屬性罗岖。
2).自身已經(jīng)對它進行一次強引用,沒有必要再強引用一次,此時也會使用 weak,自定義 IBOutlet 控件屬性一般也使用 weak;當(dāng)然腹躁,也可以使用strong桑包。
IBOutlet連出來的視圖屬性為什么可以被設(shè)置成weak?
因為父控件的subViews數(shù)組已經(jīng)對它有一個強引用。
不同點:
assign 可以用非 OC 對象纺非,而 weak 必須用于 OC 對象哑了。
weak 表明該屬性定義了一種“非擁有關(guān)系”。在屬性所指的對象銷毀時烧颖,屬性值會自動清空(nil)弱左。
6、用@property聲明的 NSString / NSArray / NSDictionary 經(jīng)常使用 copy 關(guān)鍵字炕淮,為什么科贬?如果改用strong關(guān)鍵字,可能造成什么問題鳖悠?
答:
用 @property 聲明 NSString榜掌、NSArray、NSDictionary 經(jīng)常使用 copy 關(guān)鍵字乘综,是因為他們有對應(yīng)的可變類型:NSMutableString憎账、NSMutableArray、NSMutableDictionary卡辰,他們之間可能進行賦值操作(就是把可變的賦值給不可變的)胞皱,為確保對象中的字符串值不會無意間變動邪意,應(yīng)該在設(shè)置新屬性值時拷貝一份。
1)因為父類指針可以指向子類對象,使用 copy 的目的是為了讓本對象的屬性不受外界影響,使用 copy 無論給我傳入是一個可變對象還是不可對象,我本身持有的就是一個不可變的副本反砌。
2)如果我們使用是 strong ,那么這個屬性就有可能指向一個可變對象,如果這個可變對象在外部被修改了,那么會影響該屬性雾鬼。
總結(jié):使用copy的目的是,防止把可變類型的對象賦值給不可變類型的對象時宴树,可變類型對象的值發(fā)送變化會無意間篡改不可變類型對象原來的值策菜。
7、淺拷貝和深拷貝的區(qū)別酒贬?
答:
淺拷貝:只復(fù)制指向?qū)ο蟮闹羔樣趾粡?fù)制引用對象本身。
深拷貝:復(fù)制引用對象本身锭吨。內(nèi)存中存在了兩份獨立對象本身蠢莺,當(dāng)修改A時,A_copy不變零如。
8躏将、什么是 TCP / UDP ?
TCP:傳輸控制協(xié)議。
UDP:用戶數(shù)據(jù)協(xié)議考蕾。
TCP 是面向連接的耸携,建立連接需要經(jīng)歷三次握手,是可靠的傳輸層協(xié)議辕翰。
UDP 是面向無連接的夺衍,數(shù)據(jù)傳輸是不可靠的,它只管發(fā)喜命,不管收不收得到沟沙。
簡單的說,TCP注重數(shù)據(jù)安全壁榕,而UDP數(shù)據(jù)傳輸快點矛紫,但安全性一般。
9牌里、tableView的重用機制颊咬?
答:UITableView 通過重用單元格來達(dá)到節(jié)省內(nèi)存的目的: 通過為每個單元格指定一個重用標(biāo)識符,即指定了單元格的種類,當(dāng)屏幕上的單元格滑出屏幕時牡辽,系統(tǒng)會把這個單元格添加到重用隊列中喳篇,等待被重用,當(dāng)有新單元格從屏幕外滑入屏幕內(nèi)時态辛,從重用隊列中找看有沒有可以重用的單元格麸澜,如果有,就拿過來用奏黑,如果沒有就創(chuàng)建一個來使用炊邦。