1、兩段代碼共存于一個文件,編譯時有選擇的編譯其中的一部分,請問如何實現?
答案:條件預編譯:
#if
#else
#end
#ifdef aaa 如果被定義過就執行
#else
#end
#ifndef aaa 如果沒有被定義則執行
#else
#endif
確保代碼只被執行一次```
**2、.malloc()與 calloc()的區別?**
.malloc(size)
calloc(size*n)
區別 malloc分配內存空間會有系統殘留值,calloc分配空間每次都會初始化為0
calloc 可以一次性分配多個內存空間
http://blog.csdn.net/firecityplans/article/details/4490124/```
3、如何引用一個已經定義過的全局變量
(1)引用頭文件的方式
(2)使用extern關鍵字
注意:
(1)如果是頭文件的方式,在用全局變量的時候,把變量名字寫錯了,在編譯的時候就會報錯。
(2)如果是extern關鍵字聲明,如果把全局變量的名字寫錯了,在編譯的時候不會報錯,在連接的時候報錯。
延伸:
全局變量:static exetern 無修飾符
局部變量:auto static register 無修飾符
生命周期:
常量:
(操作系統)
棧:由操作系統自動分配。存放函數的參數值,局部變量的值
堆:一般由程序員分配釋放,若程序員不釋放,程序結束時可能由OS回收,分配方式倒是類似于鏈表。
4、請簡述沙盒中3個文件夾的作用。
(1)、什么是沙盒?
iOS應用程序只能在為該程序創建的文件系統中讀取文件,不可以去其它地方訪問,此區域被成為沙盒。
所以所有的非代碼文件都要保存在此,例如圖像,圖標,聲音,映像,屬性列表,文本文件等。
(2)、沙盒中3個文件夾的作用。
Document:存儲較大數據 會同步到iTunes
Library: 存儲較大數據 不會同步到iTunes(Library下的Caches文件夾:存放緩存文件)
Temp :存儲零時文件
iPhone在重啟時,會丟棄所有的tmp文件。
(3)、獲取總目錄
5、怎么樣啟動一個新的線程,子線程怎么刷新UI?
三種方法創建新的線程:
(1)NSThread
需要管理線程的生命周期、同步、加鎖問題,這會導致一定的性能開銷
有類方法和實例方法
實例方法需要自己開啟線程。類方法不需要手動開啟線程
// 初始化線程
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];
// 設置線程的優先級(0.0 - 1.0,1.0最高級)
thread.threadPriority = 1;
// 開啟線程
[thread start];
參數解析:
selector :線程執行的方法,這個selector最多只能接收一個參數
target :selector消息發送的對象
argument : 傳給selector的唯一參數,也可以是nil
(2)NSOperation
//創建一個操作隊列
NSOperationQueue *opQueue=[[NSOperationQueue alloc]init];
操作隊列
一、添加新線程 NSInvocationOperation *op1=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(op1Action) object:nil];
添加到隊列里面
[opQueue addOperation:op1];
二、 用代碼塊的形式開辟一個新的線程
[opQueue addOperationWithBlock:^{
NSLog(@"4子線程=%@", [NSThread currentThread]);
}];
-(void)op1Action
{
NSLog(@"1子線程=%@", [NSThread currentThread]);
}
(3)GCD```
| |同步執行|異步執行|
|:---|:---|
|串行隊列|當前線程,一個一個執行| 其他線程,一個一個執行
|并行隊列| 當前線程,一個一個執行| 開很多線程,一起執行
這些應該重新總結就先不寫了
**UI的刷新操作必須在主線程里面進程刷新**
**回到主線程的方法**
`1.dispatch_sync(dispatch_get_main_queue(), ^{ });
2.performSelectorOnMainThread`
**6、類別和類擴展的區別。**
1.類別:對當前類的擴展
類別沒有屬性,只有方法
類別中的方法優先級比當前類的方法優先級高
2.類擴展:匿名類目
? 能為某個類附加額外的屬性,成員變量,方法聲明
? 一般的類擴展寫到.m文件中
? 一般的私有屬性寫到類擴展
? 使用格式:
@interface Mitchell()
屬性
方法
@end
分類: 分類的小括號必須要有名字
1.分類只能擴充方法。不能擴展屬性和成員變量(如果包含成員變量就會直接報錯)(可通過runtime添加)
2. 如果分類中聲明了一個屬性,那么分類只會生成這個屬性的set、get方法聲明,也就是不會有實現。
@interface 類名(分類名字)
方法聲明
@end
@implementation類名(分類名字)
方法實現
@end
**7、線程和進程有什么區別和聯系**
一個程序至少有一個進程,一個進程至少有一個線程。
進程:表示資源分配的基本單位,又是調度運行的基本單位。
線程:是進程中執行運算的最小單位,亦即執行處理機調度的基本單位。
同一進程中的多個線程共享代碼段(代碼和常量),數據段(全局變量和靜態變量),擴展段(堆存儲)。但是每個線程擁有自己的棧段,棧段又叫運行時段,用來存放所有局部變量和臨時變量。
**8、解釋一下KVC和KVO,什么是鍵-值,鍵路徑是什么?**
Key value coding, Key value observer.
Kvc 是路徑訪問的規范,kvo 是觀察某個變量的變化過程
KVO 可以觀察某個對象的變量變化過程,KVC 是滿足被觀察的編
碼規范。
KVC/KVO 類似于代理,通知中心。都是一種通訊方法。
**9、寫出float x 與“零值”比較的if語句**
if(fabs(x)<=0.000001)
與int類型做比較
if(x==0)
與BOOL
if(x)
與指針
if(x==NULL)(C語言的空)
**10、寫一個標準的宏定義MIN,比較輸入兩個參數并返回較小值**
define MIN(X,Y) ((X)<(Y)?(X): (Y)) (括號才是重點)
define是文本復制
寫出一年有多少秒
define YEAR_OF_SECOND ( 365 * 24 * 60 *60 )UL (UL是無符號長整形)