1.線程是什麼?進程是什麼?兩者有什麼區別和聯繫?
一個程序至少有一個進程,一個進程至少有一個線程:
進程:一個程序的一次運行,在執行過程當中擁有獨立的內存單元,而多個線程共享一塊內存
線程:線程是指進程內的一個執行單元。
聯繫:線程是進程的基本組成單位
區別:(1)調度:線程做爲調度和分配的基本單位,進程做爲擁有資源的基本單位
(2)併發性:不只進程之間能夠併發執行,同一個進程的多個線程之間也可併發執行
(3)擁有資源:進程是擁有資源的一個獨立單位,線程不擁有系統資源,但能夠訪問隸屬於進程的資源.
(4)系統開銷:在建立或撤消進程時,因爲系統都要爲之分配和回收資源,致使系統的開銷明顯大於建立或撤消線程時的開銷。html
2.簡述OC中內存管理機制。與retain配對使用的方法是dealloc仍是release,爲何?須要與alloc配對使用的方法是dealloc仍是release,爲何?readwrite,readonly,assign,retain,copy,nonatomic 、atomic、strong、weak屬性的做用?
管理機制:使用了一種叫作引用計數的機制來管理內存中的對象。OC中每一個對象都對應着他們本身的引用計數,引用計數能夠理解爲一個整數計數器,當使用alloc方法建立對象的時候,持有計數會自動設置爲1。當你向一個對象發送retain消息 時,持有計數數值會增長1。相反,當你像一個對象發送release消息時,持有計數數值會減少1。當對象的持有計數變爲0的時候,對象會釋放本身所佔用的內存。
retain(引用計數加1)->release(引用計數減1)
alloc(申請內存空間)->dealloc(釋放內存空間)
readwrite: 表示既有getter,也有setter (默認)
readonly: 表示只有getter,沒有setter
nonatomic:不考慮線程安全
atomic:線程操做安全 (默認)
線程安全狀況下的setter和getter:
- (NSString*) value {
@synchronized(self) {
return [[_value retain] autorelease];
}}
(void) setValue:(NSString*)aValue {
@synchronized(self) {
[aValue retain];
[_value release];
_value = aValue;
} }
retain: release舊的對象,將舊對象的值賦予輸入對象,再提升輸入對象的索引計數爲1
assign: 簡單賦值,不更改索引計數 (默認)
copy: 實際上是創建了一個相同的對象,地址不一樣(retain:指針拷貝 copy:內容拷貝)
strong:(ARC下的)和(MRC)retain同樣 (默認)
weak:(ARC下的)和(MRC)assign同樣, weak當指向的內存釋放掉後自動nil化,防止野指針
unsafe_unretained 聲明一個弱應用,可是不會自動nil化,也就是說,若是所指向的內存區域被釋放了,這個指針就是一個野指針了。
autoreleasing 用來修飾一個函數的參數,這個參數會在函數返回的時候被自動釋放。ios
3.類變量的@protected ,@private,@public,@package,聲明各有什麼含義?
@private:做用範圍只能在自身類
@protected:做用範圍在自身類和繼承本身的子類 (默認)
@public:做用範圍最大,能夠在任何地方被訪問。
@package:這個類型最經常使用於框架類的實例變量,同一包內能用,跨包就不能訪問數據庫
4.談談你對多線程開發的理解?ios中有幾種實現多線程的方法?
好處:
1.使用線程能夠把佔據時間長的程序中的任務放到後臺去處理
2.用戶界面能夠更加吸引人,這樣好比用戶點擊了一個按鈕去觸發某些事件的處理,能夠彈出一個進度條來顯示處理的進度
3.程序的運行速度可能加快
4·在一些等待的任務實現上如用戶輸入、文件讀寫和網絡收發數據等,線程就比較有用了。
缺點:
1.若是有大量的線程,會影響性能,由於操做系統須要在它們之間切換。
2.更多的線程須要更多的內存空間。
3.線程的停止須要考慮其對程序運行的影響。
4.一般塊模型數據是在多個線程間共享的,須要防止線程死鎖狀況的發生。
實現多線程的方法:
NSObject類方法
NSThread
NSOperation
GCDjson
5.線程同步和異步的區別?IOS中如何實現多線程的同步?
異步:舉個簡單的例子 就是遊戲,遊戲會有圖像和背景音樂
同步:是指一個線程要等待上一個線程執行完以後纔開始執行當前的線程,上廁所
NSOperationQueue:maxcurrentcount
NSConditionLock
GCD->http://blog.csdn.net/onlyou930/article/details/8225906 安全
6.獲取一臺設備惟一標識的方法有哪些?
http://www.cnblogs.com/max5945/archive/2013/06/24/3152292.html
(1)UDID
(2)UUID
(3)MAC Address
(4)OPEN UDID
(5)廣告標識符
(6)Vindor標示符
*ios7之後使用keychain 網絡
7.iOS類是否能夠多繼承?若是沒有,那能夠用其餘方法實現嗎?簡述實現過程。
不能夠多繼承 用protocol實現多線程
8.堆和棧的區別?
堆須要用戶手動釋放內存,而棧則是編譯器自動釋放內存
問題擴展:要知道OC中NSString的內存存儲方式併發
9.這段代碼有什麼問題嗎:框架
@implementation Person
- (void)setAge:(int)newAge {
self.age = newAge;
}
@end異步
正確寫法
{
if(_age){
[_age release];
}
_age = [newAge retain];
}
死循環(擴展:知道如何正確寫setter和getter方法)
10.iOS本地數據存儲都有哪幾種方式?
NSKeyedArchiver
NSUserDefaults
Write寫入方式
SQLite3
http://blog.csdn.net/tianyitianyi1/article/details/7713103
(問題擴展:什麼狀況下使用什麼樣的數據存儲)
1.NSKeyedArchiver:採用歸檔的形式來保存數據,數據對象須要遵照NSCoding協議,對象對應的類必須提供encodeWithCoder:和initWithCoder:方法。缺點:只能一次性歸檔保存以及一次性解壓。因此只能針對小量數據,對數據操做比較笨拙,若是想改動數據的某一小部分,須要解壓或歸檔整個數據。
2.NSUserDefaults:用來保存應用程序設置和屬性、用戶保存的數據。用戶再次打開程序或開機後這些數據仍然存在。NSUserDefaults能夠存儲的數據類型包括:NSData、NSString、NSNumber、NSDate、NSArray、NSDictionary。缺點:若是要存儲其餘類型,須要轉換爲前面的類型,才能用NSUserDefaults存儲。
3.Write寫入方式:永久保存在磁盤中。第一步:得到文件即將保存的路徑:第二步:生成在該路徑下的文件:第三步:往文件中寫入數據:最後:從文件中讀出數據:
4. SQLite:採用SQLite數據庫來存儲數據。SQLite做爲一中小型數據庫,應用ios中,跟前三種保存方式相比,相對比較複雜一些。
11.簡述你對UIView、UIWindow和CALayer的理解
http://blog.csdn.net/kuqideyupian/article/details/7731942
http://o0o0o0o.iteye.com/blog/1728599
12.寫一個完整的代理,包括聲明,實現
注意手寫的準確性
13.分析json、xml的區別?json、xml解析方式的底層是如何處理的?
http://www.open-open.com/bbs/view/1324367918671
http://hi.baidu.com/fevelen/item/a25253ab76f766756cd455b6
14.ViewController 的 didReceiveMemoryWarning 是在何時被調用的?默認的操做是什麼?
http://blog.sina.com.cn/s/blog_68661bd80101nn6p.html
15.面向對象的三大特徵,並做簡單的介紹
封裝、繼承、多態
多態:父類指針指向子類對象。兩種表現形式:重寫(父子類之間)和重載(本類中)
OC的多態體現是:重寫,沒有重載這種表現形式
舉例說明:
@interface Parent : NSObject //父類
- (void)simpleCall;
@end
@interface Child_A : Parent //子類 Child_A
@end
@implementation Child_A
- (void)simpleCall
{
NSLog(@」我是Child_A的simpleCall方法」);
}
@end
@interface Child_B : Parent //子類Child_B
@end
- (void)simpleCall
{
NSLog(@」我是Child_的simpleCall方法」);
}
@end
而後,咱們就能夠看到多態所展現的特性了:
Parent * pa=[[Child_A alloc] init];// 父類指針指向子類Child_A對象
Parent * pb=[[Child_B alloc] init]; //父類指針指向子類Child_B對象
[pa simpleCall];// 顯然是調用Child_A的方法
[pb simpleCall];// 顯然是調用Child_B的方法
在OC中常看見的多態體現:
- (UITableViewCell )tableView:(UITableView )tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellWithIdentifier = @」Cell」;
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellWithIdentifier];
return cell;
}
(UITableViewCell *)指向cell子類對象
16.如監測系統鍵盤的彈出
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector( ) name:UIKeyboardWillShowNotification object:nil];
擴展:ios 彈出鍵盤擋住UITextView的解決方式
17.舉出5個以上你所熟悉的ios sdk庫有哪些和第三方庫有哪些?
AFWorking/WebKit/SQLite/Core Data/Address Book
18.如何將產品進行多語言發佈?
http://fengmm521.blog.163.com/blog/static/25091358201291645852889/
19.如何將敏感字變成**
search = @」某某某」;
replace = @「*」;
range = [mstr rangeOfString:search];
[mstr replaceCharactersInRange:range withString:replace];
NSLog(@」%@」,mstr);
20.objc中的減號與加號表明什麼?
類方法
21.單例目的是什麼,並寫出一個?
避免重複建立 節省內存空間 static Model * model; +(id)singleton{ if(!model){ @synchronized(self){ model = [[Model alloc]init]; }} return model; }