一.OC的類可以多重繼承么熏纯?可以實現(xiàn)多個接口么?Category是什么着茸?重寫一個類的方式用繼承還是分類好壮锻?為什么?
不可以多重繼承涮阔;可以實現(xiàn)多個接口猜绣,通過實現(xiàn)多個接口可以完成C++的多重即成;
Category:是類別敬特,用于向已經(jīng)從在的類添加方法從而達(dá)到擴展已有類的目的掰邢,和子類不同的是,Category不能用于向北擴展類添加實例變量伟阔,通常作為一種組織框架代碼的工具來使用.
Category的用途:
1.在不創(chuàng)建繼承類的情況下實現(xiàn)對已由類的拓展辣之。
2.簡化類的開發(fā)工作
3.將常用的相關(guān)方法分組。
4.在沒有源代碼的情況下可以用來修復(fù)BUG
一般情況下用分類好皱炉,用Category去重寫類的方法怀估,僅對本Cayegory有效,不會影響到其他類與原有類的關(guān)系合搅。
二.#import和#include由什么區(qū)別多搀,@class呢,#import<>跟#import""又有什么區(qū)別?
1.#import是OC導(dǎo)入頭文件的關(guān)鍵字,#include是C/C++導(dǎo)入頭文件的關(guān)鍵字,使用#import頭文件會自動只導(dǎo)入一次不會重復(fù)導(dǎo)入灾部,相當(dāng)于#include和#pragma once;
2.@class告訴編譯器某個類的聲明康铭,當(dāng)執(zhí)行時,才會去查看類的實現(xiàn)文件赌髓,可以解決頭文件的互相飽含从藤;
3.#improt<>用來包含系統(tǒng)的頭文件,#imoport""用來包含用戶頭文件
三.屬性readwrite,readonly,assign,retain,copy,nonatomic各什么作用春弥?在哪種情況下使用
readwrite:可讀可寫呛哟,需要生成getter,setter方法時使用
readonly:只讀,只會生成getter方法匿沛,不會生成setter方法扫责,不希望屬性在類外改變
assign:賦值,setter方法將傳入?yún)?shù)賦值給實例變量逃呼,僅設(shè)置變量時使用
retain:表示持有特性鳖孤,setter方法將傳入?yún)?shù)西安保留者娱,再賦值,傳入?yún)?shù)的retaincount會+1苏揣;
copy:表示拷貝特性黄鳍,setter方法將傳入對象復(fù)制一份,需要完全一份心得變量時使用平匈。
nonatomic非原子操作框沟,決定編譯器生成的setter,getter是否是原子操作,atomic表示多線程安全增炭,一般使用nonatomic.
四.寫一個setter方法用于完成@property(nonatomic,retain)NSStringname,寫一個setter方法用于完成@property(nonatomic,copy)NSStringname
-(void)setName:(NSString *)str
{
[name retain];
[name release];
name = str;
}
-(void)setName:(NSString*)str
{
id t = [str copy];
[name release];
name = t;
}
五.對于語句NSString *obj = [NSData alloc]init];obj在編譯時和運行時分別是什么類型的對象忍燥。
編譯時是字符串類型,運行時是NSData類型對象
六.常見的OC數(shù)據(jù)類型有哪些隙姿,和C的基本數(shù)據(jù)類型有什么區(qū)別梅垄。
NSString,NSArray,NSMutableArray,NSData等等,這些都是class,創(chuàng)建后便是對象输玷,而C語言的基本數(shù)據(jù)類型是int队丝,知識一定子節(jié)的內(nèi)存空間,用于存放數(shù)值欲鹏。
七.id聲明的對象有什么特性
id聲明的對象具有運行時的特性机久,可以指向任意類型的OC的對象
八.OC如何對內(nèi)存管理的,說說你的看法和解決方法貌虾。
1.ARC(自動內(nèi)存計數(shù)):通過alloc-initial方法創(chuàng)建的吞加,創(chuàng)建后引用計數(shù)+1裙犹,此后每retain一次引用計數(shù)+1尽狠,那么在程序中做相應(yīng)次數(shù)的release就可以了。
2.手動內(nèi)存技術(shù):一般由類的靜態(tài)方法創(chuàng)建叶圃,函數(shù)名不會出現(xiàn)alloc或init滋養(yǎng)袄膏,創(chuàng)建后引用計數(shù)+0,在函數(shù)出棧后釋放掺冠,相當(dāng)于一個棧上的局部變量沉馆,也可以通過retain延長對象的生存期。
3.內(nèi)存池:可以通過創(chuàng)建和釋放內(nèi)存池控制內(nèi)存申請和回收的時機德崭。由autorelease加入系統(tǒng)內(nèi)存池斥黑,內(nèi)存池時可以嵌套的,每個內(nèi)存池都需要由一個創(chuàng)建釋放對眉厨,將一個對象加入到最內(nèi)層的系統(tǒng)內(nèi)存池锌奴,當(dāng)我們釋放這個內(nèi)存池時,其中的對象都會被釋放憾股。
八.使用nonatomic一定是線程安全的嗎鹿蜀?
nonatomic的內(nèi)存管理語義是非原子的箕慧,非原子的操作本來就是線程不安全的,而atomic的操作是原子的茴恰,但并不代表線程安全颠焦,能夠增加正確機率,更好的避免線程錯誤往枣,但是仍然是線程不安全的伐庭。
當(dāng)使用nonatomic的時候,屬性的setter和getter操作是非原子的分冈,所以多個線程對某一屬性進(jìn)行讀和寫的操作似忧,屬性的最終結(jié)果是不能預(yù)測的。
atomic是線程安全的,nonatomic是線程不安全的丈秩。如果只是單線程操作的話用nonatomic最好盯捌,因為后者效率高。
九.如何高性能的給UIImageView加個圓角? (不準(zhǔn)說layer.cornerRadius!)
一般情況下給 UIImageView 或者說 UIKit 的控件添加圓角都是改變clipsToBounds和layer.cornerRadius, 這樣大約兩行代碼就可以解決. 但是, 這樣使用這樣的方法會強制 Core Animation 提前渲染屏幕的離屏繪制, 而離屏繪制就會為性能帶來負(fù)面影響.
我們也可以使用另一種比較復(fù)雜的方式來為圖片添加圓角, 這里就用到了貝塞爾曲線.
UIImageViewimageView= [[UIImageView alloc] initWithFrame:CGRectMake(0,0,100,100)]; imageView.center = CGPointMake(200,300); UIImageanotherImage= [UIImage imageNamed:@"image"]; UIGraphicsBeginImageContextWithOptions(imageView.bounds.size, NO, 1.0); [[UIBezierPath bezierPathWithRoundedRect:imageView.boundscornerRadius:50] addClip];[anotherImage drawInRect:imageView.bounds];imageView.image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); [self.view addSubview:imageView];
十.http的POST和GET有什么區(qū)別
GET類型的請求是冪等的蘑秽,而POST請求是有副作用的饺著,GET用于獲取一些資源而POST用于改變一些資源,這可能會創(chuàng)建新的資源或者更新已有的資源肠牲。POST請求比GET請求更加安全幼衰,也可以傳輸更多的信息。