iOS基礎細節

smile麗語發表於2018-01-03

最近一朋友正準備跳槽,就從各處搜尋整理一些基礎,便於朋友複習,也便於自己複習檢視。

  1. 回答person的retainCount值,並解釋為什麼
Person *per = [[Person alloc] init]; //此時person 的retainCount的值是1
self.person = per;
//在self.person 時,如果是assign,person的 retainCount的值不變,仍為1 
若是:retain person的retainCount的值加1,變為2
若是:copy person的retainCount值不變,仍為1 
複製程式碼

2、 這段程式碼有什麼問題嗎:

@implementation Person

- (void)setAge:(int)newAge { 
    self.age = newAge; 
} 
@end 
複製程式碼

會死迴圈,會重複呼叫自己! self.age 改為**_age**即可; 並且書寫不規範:setter方法中的newAge應該為age

3、這段程式碼有什麼問題,如何修改


for (int i = 0; i < someLargeNumber; i++) {
     NSString *string = @”Abc”;
    
string = [string lowercaseString];

    string = [string stringByAppendingString:@"xyz"]; 
    NSLog(@“%@”, string);

}

會出現記憶體洩露
修改之後:

for(int i = 0; i<1000;i++){ 
    NSAutoreleasePool * pool1 = [[NSAutoreleasePool alloc] init]; 
    NSString *string = @"Abc";

    string = [string lowercaseString];

    string = [string stringByAppendingString:@"xyz"]; 
    NSLog(@"%@",string); 
//釋放池 
[pool1 drain];
 } 
複製程式碼

延伸:堆疊的區別: (1)管理方式:對於棧來講,是由編譯器自動管理,無需我們手工控制;對於堆來說,釋放工作由程式設計師控制,容易產生 memory leak。 (2)申請大小:能從棧獲得的空間較小,堆是向高地址擴充套件的資料結構,是不連續的記憶體區域。堆的大小受限於計算機系統中 有效的虛擬記憶體。由此可見,堆獲得的空間比較靈活,也比較大。 (3)碎片問題:對於堆來講,頻繁的new/delete勢必會造成記憶體空間的不連續,從而造成大量的碎片,使程式效率降低。 對於棧來講,則不會存在這個問題,因為棧是先進後出的佇列,他們是如此的一一對應,以至於永遠都不可能有一個記憶體塊 從棧中間彈出 (4)分配方式:堆都是動態分配的,沒有靜態分配的堆。棧有2種分配方式:靜態分配和動態分配。靜態分配是編譯器完成 的,比如區域性變數的分配。動態分配由 alloca函式進行分配,但是棧的動態分配和堆是不同的,他的動態分配是由編譯器 進行釋放,無需我們手工實現。 (5)分配效率:棧是機器系統提供的資料結構,計算機會在底層對棧提供支援:分配專門的暫存器存放棧的地址,壓棧出棧 都有專門的指令執行,這就決定了棧的效率比較高。堆則是C/C++函式庫提供的,它的機制是很複雜的。

4、寫一個便利構造器

+(id)Person { 
  Person *person=[Person alloc]init];
  
return [person autorelease]; // 備註:ARC時不用 autorelease 
} 
複製程式碼

5、擷取字串”20 | http://www.baidu.com”中,”|”字元前面和後面的資料,分別輸出它們。

NSString * str = @"20 | http://www.baidu.com";

NSArray *array = [str componentsSeparatedByString:@"|"]; //這是分別輸出的擷取後的字串 
for (int i = 0; i<[array count]; ++i) { 
    NSLog(@"%d=%@", i, [array objectAtIndex:i]); 
} 
複製程式碼

6、用obj-c寫一個氣泡排序

-(void)mySort:(NSMutableArray *)mutArray { 
      id tmpObj = nil;

      unsigned long flag = mutArray.count-1;//flag :最大腳標
       while (flag > 0) { 
            int k = flag;

            flag = 0;

            for (int j = 0 ; j < k ; j++) { 
                    int order = NSOrderedAscending;// 或   NSOrderedDescending
if ([[mutArray[j] description] compare:[mutArray[j+1] description]] == -order) { 
            tmpObj = mutArray[j]; 
            mutArray[j] = mutArray[j+1]; 
            mutArray[j+1] = tmpObj;
             flag = j; 
            }
         } 
    } 
} 
複製程式碼

延伸:C語言的氣泡排序: (1)冒泡法對一維陣列中的元素進行排序

- void sort(int arr[],int arr_len)
{ 
    for(int i=0;i<arr_len-1;i++)//外層迴圈 { 
    for(int j=0;j<arr_len-1-i;j++)//藉助j實現一趟的次數 { 
        if(arr[j]>arr[j+1]) { 
            int temp=0; 
            temp=arr[j]; 
            arr[j]=arr[j+1]; 
            arr[j+1]=temp; 
} } 
} } 
複製程式碼

(2)用指標陣列給字串排序

-
void sort_a(char * name[],int n) { 
char *temp;
for(int i=0;i<n-1;i++) { 
for(int j=0;j<n-1-i;j++) { 
if(strcmp(name[j], name[j+1])>0) 
{

temp=name[j]; name[j]=name[j+1]; name[j+1]=temp; 
} } 
} } 
複製程式碼

(3)給字串陣列排序

-
void rang(char str[][20],int n) { 
for(int i=0;i<n-1;i++) { 
for(int j=0;j<n-1-i;j++) { 
int result=strcmp(str[j],str[j+1]); if(result>=0)
{ 
char temp[20]; strcpy(temp, str[j]); strcpy(str[j], str[j+1]); strcpy(str[j+1], temp); 
} } 
} } 
複製程式碼

7、簡述你對UIView、UIWindow和CALayer的理解 UIView:屬於UIkit.framework框架,負責渲染矩形區域的內容,為矩形區域新增動畫,響應區域的觸控事件,佈局和管 理一個或多個子檢視 UIWindow:屬於UIKit.framework框架,是一種特殊的UIView,通常在一個程式中只會有一個UIWindow,但可以手 動建立多個UIWindow,同時加到程式裡面。UIWindow在程式中主要起到三個作用: 1、作為容器,包含app所要顯示的所有檢視 2、傳遞觸控訊息到程式中view和其他物件 3、與UIViewController協同工作,方便完成裝置方向旋轉的支援 CAlayer:屬於QuartzCore.framework,是用來繪製內容的,對內容進行動畫處理依賴與UIView來進行顯示,不能處 理使用者事件。UIView和CALayer是相互依賴的,UIView依賴CALayer提供內容,CALayer依賴UIView一共容器顯示 繪製內容。 延伸: UIViewController:管理檢視的幾成熟,每個檢視控制器都有一個自帶的檢視,並且負責這個檢視相關的一切事務。方便 管理檢視中的子檢視,負責model與view的通訊;檢測裝置旋轉以及記憶體警告;是所有檢視控制類的積累,定義了控制器 的基本功能。 UIResponder的那張圖

8、寫一個完整的代理,包括宣告,實現


//建立

@protocol BeforeMarriedDelagate <NSObject> @required 
-(void)doCook:(NSString *)foodName; 
-(void)doHomework;
@optional
-(void)driveCar; 
-(void)makeMoney; @
end 

//宣告

@interface Boy : NSObject< BeforeMarriedDelagate> 
-(void)doCook:(NSString *)foodName; -(void)doHomework; -(void)makeMoney;
//實現 
@implementation Boy
-(void)doCook:(NSString *)foodName
{ NSLog(@"做飯:%@!",foodName);}
-(void)doHomework
{ NSLog(@"今天洗衣服!");}
-(void)makeMoney
{ NSLog(@"Coding!!");}

@end

複製程式碼

9、分析json、xml的區別?json、xml解析方式的底層是如何處理的? 區別: (1)可讀性方面:基本相同,xml的可讀性比較好 (2)可擴充套件性方面:都具有很好的擴充套件性 (3)編碼難度方面:相對而言:JSON的編碼比較容易 (4)解碼難度:json的解碼難度基本為零,xml需要考慮子節點和父節點 (5)資料體積方面:json相對於xml來講,資料體積小,傳遞的速度跟快些 (6)資料互動方面:json與JavaScript的互動更加方面,更容易解析處理,更好的資料互動 (7)資料描述方面:xml對資料描述性比較好 (8)傳輸速度方面:json的速度遠遠快於xml JSON底層原理:遍歷字串中的字元,最終根據格式規定的特殊字元,比如{}號,[]號, : 號 等進行區分,{}號是一個字典 的開始,[]號是一個陣列的開始, : 號是字典的鍵和值的分水嶺,最終乃是將json資料轉化為字典,字典中值可能是字典,數 組,或字串而已。 XML底層原理: XML解析常用的解析方法有兩種:DOM解析和SAX解析。 DOM 採用建立樹形結構的方式訪問 XML 文件,而 SAX 採用的事件模型。 。DOM 解析把 XML 文件轉化為一個包含其內容的樹,並可以對樹進行遍歷。使用 DOM 解析器的時候需 要處理整個 XML 文件,所以對效能和記憶體的要求比較高。SAX在解析 XML 文件的時候可以觸發一系列的事件,當發現給定的tag 的時候,它可以啟用一個回撥方法,告訴該方法制定的標籤已經找到。SAX 對記憶體的要求通常會比較低,因為它讓開發人員自己來決 定所要處理的tag。特別是當開發人員只需要處理文件中所包含的部分資料時,SAX 這種擴充套件能力得到了更好的體現。

延伸:SAX與DOM的區別: 1、SAX處理的優點非常類似於流媒體的優點。分析能夠立即開始,而不是等待所有的資料被處理。而且由於應用程式只是 在讀取資料時檢查資料,因此不需要將資料儲存在記憶體中。這對於大型文件來說是個巨大的優點。事實上,應用程式甚至不 必解析整個文件;它可以在某個條件得到 滿足時停止解析。一般來說,SAX 還比它的替代者 DOM 快許多。另一方面,由於應用程式沒有以任何方式儲存資料,使用 SAX 來更改資料或在資料流中往後移是不可能的。 2、DOM 以及廣義的基於樹的處理具有幾個優點。首先,由於樹在記憶體中是持久的,因此可以修改它以便應用程式能對數 據和結構作出更改。它還可以在任何時候在樹中上下 導航,而不是像 SAX 那樣是一次性的處理。DOM 使用起來也要簡單 得多。另一方面,在記憶體中構造這樣的樹涉及大量的開銷。大型檔案完全佔用系統記憶體容量的情況並不鮮見。此外,建立一 棵 DOM 樹可能是一個緩慢的過程。 3、選擇 DOM 還是選擇 SAX,這取決於下面幾個因素: 應用程式的目的:如果打算對資料作出更改並將它輸出為 XML,那麼在大多數情況下,DOM 是適當的選擇。並不是說使 用 SAX 就不能更改資料,但是該過程要複雜得多,因為您必須對資料的一份拷貝而不是對資料本身作出更改。 資料容量: 對於大型檔案,SAX 是更好的選擇。資料將如何使用:如果只有資料中的少量部分會被使用,那麼使用 SAX 來將該部分資料提取到應用程式中可能更好。 另一方面,如果您知道自己以後會回頭引用已處理過的大量資訊,那麼 SAX 也許不是恰當的選擇。 對速度的需要:SAX 實現通常要比 DOM 實現更快。 SAX 和 DOM 不是相互排斥的,記住這點很重要。您可以使用 DOM 來建立 SAX 事件流,也可以使用 SAX 來建立 DOM 樹。事實上,用於建立 DOM 樹的大多數解析器實際上都使用 SAX 來完成這個任務!

10、ViewController 的 didReceiveMemoryWarning 是在什麼時候被呼叫的?預設的操作是什麼? 當程式接到記憶體警告時ViewController將會收到這個訊息:didReceiveMemoryWarning 從iOS3.0開始,不需要過載這個函式,把釋放記憶體的程式碼放到viewDidUnload中去。 這個函式的預設實現是:檢查controller是否可以安全地釋放它的view,如果view可以被釋放,那麼這個函式釋放view並 呼叫viewDidUnload。過載這個函式來釋放controller中使用的其他記憶體。但要記得呼叫這個函式的super實現來允許父類(一般是UIVIewController)釋放view。 如果你的ViewController儲存著view的子view的引用,那麼,在早期的iOS版本中,你應該在這個函式中來釋放這些引 用。而在iOS3.0或更高版本中,你應該在viewDidUnload中釋放這些引用。

11、物件導向的三大特徵,並作簡單的介紹。 物件導向的三個基本特徵是:封裝、繼承、多型。

1)封裝是物件導向的特徵之一,是物件和類概念的主要特性。 封裝,也就是把客觀事物封裝成抽象的類,並且類可以把自己的資料和方法只讓可信的類或者物件操作,對不可信的進行資訊隱藏。隱藏物件的屬性和實現細節,僅對外公開介面,提高程式碼安全性,封轉程度越高,獨立性越強,使用越方便。 2)繼承是指這樣一種能力:它可以使用現有類的所有功能,並在無需重新編寫原來的類的情況下對這些功能進行擴充套件。 通過 繼承建立的新類稱為“子類”或“派生類”。 被繼承的類稱為“基類”、“父類”或“超類” 3)多型性:允許你將父物件設定成為和一個或更多的他的子物件相等的技術,賦值之後,父物件就可以根據當前賦值給它的子 物件的特性以不同的方式運作。簡單的說,就是一句話:允許將子類型別的指標賦值給父類型別的指標

12、我們說的obc是動態執行時語言是什麼意思? 多型。主要是將資料型別的確定由編譯時,推遲到了執行時。這個問題其實淺涉及到兩個概念,執行時和多型。簡單來說, 執行時機制使我們直到執行時才去決定一個物件的類別,以及呼叫該類別物件指定方法。多型:不同物件以自己的方式響應 相同的訊息的能力叫做多型。意思就是假設生物類(life)都用有一個相同的方法-eat;那人類屬於生物,豬也屬於生物,都 繼承了life後,實現各自的eat,但是呼叫是我們只需呼叫各自的eat方法。也就是不同的物件以自己的方式響應了相同的訊息(響應了eat這個選擇器)。因此也可以說,執行時機制是多型的基礎

13、readwrite,readonly,assign,retain,copy,nonatomic 、strong、weak屬性的作用?並區別 strong(強引用)、 weak(弱引用)?什麼情況使用copy,assign,和retain? readwrite 是可讀可寫特性;需要生成getter方法和setter方法時 readonly 是隻讀特性 只會生成getter方法 不會生成setter方法 ;不希望屬性在類外改變 assign 是賦值特性,setter方法將傳入引數賦值給例項變數;僅設定變數時; retain 表示持有特性,setter方法將傳入引數先保留,再賦值,傳入引數的retaincount會+1; copy 表示賦值特性,setter方法將傳入物件複製一份;需要完全一份新的變數時。 nonatomic 非原子操作,決定編譯器生成的setter getter是否是原子操作,atomic表示多執行緒安全,一般使用 nonatomic assign用於簡單資料型別,如NSInteger,double,bool。 retain 和copy使用者物件,copy用於當 a指向一個物件,b也想指向同樣的物件的時候,如果用assign,a如果釋放,再 呼叫b會crash,如果用copy 的方式,a和b各自有自己的記憶體,就可以解決這個問題。retain 會使計數器加1,也可以解 決assign的問題。另外:atomic和nonatomic用來決定編譯器生成的getter和setter是否為原子操作。 在多執行緒環境 下,原子操作是必要的,否則有可能引起錯誤的結果。

14、為什麼很多內建類如UITableViewController的delegate屬性都是assign而不是retain的? 會引起迴圈引用----若是retain,在alloc一次之後,若release一次,會導致內訓洩漏,若release兩次會導致兩個 物件的dealloc巢狀執行,結果就是都沒有執行成功,最後崩潰! 所有的引用計數系統,都存在迴圈應用的問題。例如下面的引用關係:

  • 物件a建立並引用到了物件b. * 物件b建立並引用到了物件c. * 物件c建立並引用到了物件b. 這時候b和c的引用計數分別是2和1。 當a不再使用b,呼叫release釋放對b的所有權,因為c還引用了b,所以b的引用計數為1,b不會被釋放。 b不釋放,c的引用計數就是1,c也不會被釋放。從此,b和c永遠留在記憶體中。 這種情況,必須打斷迴圈引用,通過其他規則來維護引用關係。我們常見的delegate往往是assign方式的屬性而不是 retain方式 的屬性,賦值不會增加引用計數,就是為了防止delegation兩端產生不必要的迴圈引用。 如果一個UITableViewController 物件a通過retain獲取了UITableView物件b的所有權,這個UITableView物件b的 delegate又是a,如果這個delegate是retain方式的,那基本上就沒有機會釋放這兩個物件了。自己在設計使用 delegate模式時,也要注意這點。 15、ObjC中,與retain配對使用的方法是dealloc還是release,為什麼?需要與alloc配對使用的方法是dealloc還 是release,為什麼? 與retain配對使用的方法是release,因為retain使retainCount計數加1,release使retainCount計數減1;與 retain語義相反的是release。 與alloc配對使用的是release,因為:alloc是使retainCount計數加1,,使retainCount計數減1。與alloc語義相反 的是dealloc,因為:alloc是建立一個物件,,dealloc是銷燬一個物件。

16、重寫一個NSStrng型別的,retain方式宣告name屬性的setter和getter方法 { NSString * _name; } @property NSString name;----加上這些是為了避免錯誤 setter方法: -(void)setName:(NSString)name { {[_name release]; _name=[name retain]; } }

17、分別描述記憶體管理要點、autorelease、release、NSAutoreleasePool?並說明autorelease是什 麼時候被release的?簡述什麼時候由你負責釋放物件,什麼時候不由你釋放?[NSAutoreleasePool release] 和[NSAutoreleasePool drain]有什麼區別? 記憶體管理要點: Objective-C 使用引用計數機制(retainCount)來管理記憶體。記憶體每被引用一次,該記憶體的引用計數+1,每被釋放一次引 用計數-1。當引用計數 = 0 的時候,呼叫該物件的 dealloc 方法,來徹底從記憶體中刪除該物件。 alloc,allocWithZone,new(帶初始化)時:該物件引用計數 +1; retain:手動為該物件引用計數 +1; copy:物件引用計數 +1; mutableCopy:生成一個新物件,新物件引用計數為 1; release:手動為該物件引用計數 -1; autorelease:把該物件放入自動釋放池,當自動釋放池釋放時,其內的物件引用計數 -1。 NSAutoreleasePool: NSAutoreleasePool是通過接收物件向它傳送的autorelease訊息,記錄該物件的release訊息,當自動釋放池被銷燬 時,會自動向池中的物件傳送release訊息。 autorelease 是在自動釋放池被銷燬,向池中的物件傳送release 只能釋放自己擁有的物件, 區別是:在引用計數環境下(在不使用ARC情況下),兩者基本一樣,在GC環境下,release 是一個no-op(無效操 作),所以無論是不是gc都使用drain

18 IPhone OS有沒有垃圾回收?autorelease 和垃圾回收制(gc)有什麼關係? 沒有。autorelease只是延遲釋放,gc是每隔一段時間詢問程式,看是否有無指標指向的物件,若有,就將它回收。他們 兩者沒有什麼關係。

19、drawRect和layoutSubviews的區別 兩個方法都是非同步執行的,layoutSubviews方便資料計算,drawRect方便檢視重繪。 layoutSubviews對subviews重新佈局 layoutSubviews方法呼叫先於drawRect

20、簡述NotificationCenter、KVC、KVO、Delegate?並說明它們之間的區別? Notification 是觀察者模式的實現,KVO是觀察者模式的OB-C底層實現。 NOtification 通過 Notifydcation addobserver 和 remove observer 工作。 KVO是鍵值監聽,鍵值觀察機制,提供了觀察某一屬性變化的方法 KVC是鍵值編碼,是一種間接訪問物件的屬性,使用字串來標示屬性(例如:setValue:forKey:) Delegate:把某個物件要做的事情委託給別的物件去做。那麼別的物件就是這個物件的代理,代替它來打理要做的事。反映到程式中,首先要明確一個物件的委託方是哪個物件,委託所做的內容是什麼。 區別:

21、執行緒與程式的區別和聯絡? 執行緒是程式的基本單位 程式和執行緒都是由作業系統所體會的程式執行的基本單元,系統利用該基本單元實現系統對應用的併發性。 程式和執行緒的主要差別在於它們是不同的作業系統資源管理方式。程式有獨立的地址空間,一個程式崩潰後,在保護模式下 不會對其它程式產生影響,而執行緒只是一個程式中的不同執行路徑。執行緒有自己的堆疊和區域性變數,但執行緒之間沒有單獨的 地址空間,一個執行緒死掉就等於整個程式死掉,所以多程式的程式要比多執行緒的程式健壯,但在程式切換時,耗費資源較 大,效率要差一些。但對於一些要求同時進行並且又要共享某些變數的併發操作,只能用執行緒,不能用程式。

22、簡述多執行緒的作用以及什麼地方會用到多執行緒?OC實現多執行緒的方法有哪些?談談多執行緒安全問題的幾種解 決方案?何為執行緒同步,如何實現的?分執行緒回撥主執行緒方法是什麼,有什麼作用? getter方法 -(NSString*)name {return _name if(_name!=name) } (1)、多執行緒的作用:可以解決負載均衡問題,充分利用cpu資源 。為了提高CPU的使用率,採用多執行緒的方式去同時完 成幾件事情而互不干擾, (2)、大多情況下,要用到多執行緒的主要是需要處理大量的IO操作時或處理的情況需要花大量的時間等等,比如:讀寫文 件、視訊影象的採集、處理、顯示、儲存等。 (3)、ios有三種主要方法:1、NSThread。2、NSOperation。3、GCD。 (4)、解決方案:使用鎖:鎖是執行緒程式設計同步工具的基礎。鎖可以讓你很容易保護程式碼中一大塊區域以便你可以確保程式碼的正 確性。使用POSIX互斥鎖;使用NSLock類;使用@synchronized指令等。 (5)、回到主執行緒的方法: dispatch_async(dispatch_get_main_queue(), ^{ }); 作用:主執行緒是顯示UI介面,子執行緒多數是進行資料處理

23、http和scoket通訊的區別?socket連線相關庫,TCP,UDP的連線方法,HTTP的幾種常用方式? http和scoket通訊的區別: http是客戶端用http協議進行請求,傳送請求時候需要封裝http請求頭,並繫結請求的資料,伺服器一般有web伺服器配 合(當然也非絕對)。 http請求方式為客戶端主動發起請求,伺服器才能給響應,一次請求完畢後則斷開連線,以節省資 源。伺服器不能主動給客戶端響應(除非採取http長連線技術)。iphone主要使用類是NSUrlConnection。 scoket是客戶端跟伺服器直接使用socket“套接字”進行連線,並沒有規定連線後斷開,所以客戶端和伺服器可以保持連 接通道,雙方都可以主動傳送資料。一般在遊戲開發或股票開發這種要求即時性很強並且保持傳送資料量比較大的場合使用。主要使用類是CFSocketRef。 UDP:是使用者資料包協議:主要用在實時性要求高以及對質量相對較弱的地方,但面對現在高質量的線路不是容易丟包除非 是一些擁塞條件下 ,如流媒體 TCP:是傳輸控制協議:是面連線的,那麼執行環境必然要求其可靠性不可丟包有良好的擁塞控制機制如http ftp telnet 等 http的常用方式:get,post

24、What is lazy loading? 就是懶漢模式,只在用到的時候才去初始化。也可以理解成延時載入。 我覺得最好也最簡單的一個列子就是tableView中圖片的載入顯示了。 一個延時載,避免記憶體過高,一個非同步載入,避免執行緒堵塞。

25、你連線伺服器用的是什麼方法,如果請求過程中,網路出了問題這麼辦? NSUrlConnection 連線後,有一系列委託方法來接受來自伺服器的響應和資料,其中接受相應的方法回得到伺服器要傳回的資料有多大,接受資料的方法會反覆呼叫來不斷接受伺服器資料,如果網路出了問題了,會呼叫一個方法讓你來做相關處理。

26、OC有多繼承嗎?沒有的話可以用什麼方法替---多繼承即一個子類可以有多個父類,它繼承了多個父類的特 性。 Object-c的類沒有多繼承,只支援單繼承,如果要實現多繼承的話,可以通過類別和協議的方式來實現,OC類似於多繼承,是在 用protocol委託代理來實現的;可以實現多個介面,通過實現多個介面可以完成C++的多重繼承;Category是類別,一 般情況用分類好,用Category去重寫類的方法,僅對本Category有效,不會影響到其他類與原有類的關係。

27、什麼是Protocol?什麼是代理?寫一個委託的interface?委託的property宣告用什麼屬性?為什麼? Protocol:一個方法簽名的列表,在其中可以定義若干個方法。根據配置,遵守協議的類,會實現這個協議中的若干個方法。 代理:實現這個協議中的方法的類 委託的interface:宣告一個某協議的屬性delagate 用assgin屬性,原因是,為了避免迴圈引用。

28、分別描述類別(categories)和延展(extensions)是什麼?以及兩者的區別?繼承和類別在實現中有何區 別?為什麼Category只能為物件新增方法,卻不能新增成員變數? 類別:在沒有原類.m檔案的基礎上,給該類新增方法; 延展:一種特殊形式的類別,主要在一個類的.m檔案裡宣告和實現延展的作用,就是給某類新增私有方法或是私有變數。 兩個的區別:延展可以新增屬性並且它新增的方法是必須要實現的。延展可以認為是一個私有的類目。 繼承和類別在實現中的區別:類別可以在不獲悉,不改變原來程式碼的情況下往裡面新增新的方法,只能新增,不能刪除修改。並且如果類別和原來類中的方法產生名稱衝突,則類別將覆蓋原來的方法,因為類別具有更高的優先順序。 Category只能為物件新增方法,卻不能新增成員變數的原因:如果可以新增成員變數,新增的成員變數沒有辦法初始化----這是語言規則

29、寫一個NSString類的實現+ (id)initWithCString:(constchar *)nullTerminatedCString encoding: (NSStringEncoding)encoding; { NSString *obj; obj = [self allocWithZone: NSDefaultMallocZone()]; obj = [obj initWithCString: nullTerminatedCString encoding: encoding]; return [obj autorelease]; }

30、Objective-C有私有方法麼?私有變數呢?如多沒有的話,有沒有什麼代替的方法? objective-c類裡面的方法只有兩種, 靜態方法和例項方法.但是可以通過把方法的宣告和定義都放在.m檔案中來實現一個表面上的私有方法。有私有變數,可以通過@private來修飾,或者把宣告放到.m檔案中。在Objective‐C中,所有例項變數預設都是私有的,所有例項方法預設都是公有的

31、#import、#include和@class有什麼區別 @class一般用於標頭檔案中需要宣告該類的某個例項變數的時候用到,它只是宣告瞭一個類名,關於這個類的內部實現都沒有告訴編譯器,在m檔案中還是需要使用#import。 而#import比起#include的好處就是不會引起交叉編譯。

32、談談你對MVC的理解?為什麼要用MVC?在Cocoa中MVC是怎麼實現的?你還熟悉其他的OC設計模式或別 的設計模式嗎? MVC就是Model-View-Controller的縮寫,M指的是業務模型,V指的是使用者頁面,C指的是控制器。MVC是架構模式,是講M和 V的程式碼分離,從而使同那個一個程式可以使用不同的表現形式。 M:表示資料和業務規則,V是使用者看到的並與之互動的頁面,C是接受使用者的輸入並呼叫M和V取完成使用者需求的 單例,代理,觀察者,工廠模式等 單例模式:說白了就是一個類不通過alloc方式建立物件,而是用一個靜態方法返回這個類的物件。系統只需要擁有一個的 全域性物件,這樣有利於我們協調系統整體的行為; 代理模式:代理模式給某一個物件提供一個代理物件,並由代理物件控制對源物件的引用.比如一個工廠生產了產品,並不想 直接賣給使用者,而是搞了很多代理商,使用者可以直接找代理商買東西,代理商從工廠進貨.常見的如QQ的自動回覆就屬於代 理攔截,代理模式在iphone中得到廣泛應用. 觀察者模式: 當一個物體發生變化時,會通知所有觀察這個物體的觀察者讓其做出反應。實現起來無非就是把所有觀察者的 物件給這個物體,當這個物體的發生改變,就會呼叫遍歷所有觀察者的物件呼叫觀察者的方法從而達到通知觀察者的目的;

33、如監測系統鍵盤的彈出

  • (id) init { self = [super init]; if (self) { NSNotificationCenter *center = [NSNotificationCenter defaultCenter]; [center addObserver:self selector:@selector(keyboardDidShow) name:UIKeyboardDidShowNotification object:nil]; [center addObserver:self selector:@selector(keyboardDidHide) name:UIKeyboardWillHideNotification object:nil]; _keyboardIsVisible = NO; } return self; }
  •   -  (void)keyboardDidShow { 
    複製程式碼

_keyboardIsVisible = YES; }

  •   -  (void)keyboardDidHide { 
    複製程式碼

_keyboardIsVisible = NO; }

  •   -  (BOOL)keyboardIsVisible { 
    複製程式碼

return _keyboardIsVisible; }

34、objective-c中的詞典物件、可變詞典物件是哪個,初始化一個含有兩個鍵值對的可變詞典物件,並動態的添 加和刪除一條記錄,輸出第一條記錄 詞典NSDictionary,可變詞典NSMutableDictionary, //初始化一個可變詞典,帶有2個鍵值對 NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"value1",@"key1",@"value2",@"key2",nil]; //新增 [dic setObject:@"value3" forKey:@"key3"]; //刪除 [dic removeObjectForKey:@"key3"]; //獲取(按key獲取) [dic objectForKey:@"key1"];

35、c和obj-c如何混用? 1)obj-c的編譯器處理字尾為m的檔案時,可以識別obj-c和c的程式碼,處理mm檔案可以識別obj-c,c,c++程式碼,但cpp檔案必須只 能用c/c++程式碼,而且cpp檔案include的標頭檔案中,也不能出現obj- c的程式碼,因為cpp只是cpp。 2) 在mm檔案中混用cpp直接使用即可,所以obj-c混cpp不是問題 3)在cpp中混用obj- c其實就是使用obj-c編寫的模組是我們想要的。如果模組以類實現,那麼要按照cpp class的標準寫類的定義,標頭檔案中不能出現obj-c的東西,包括#import cocoa的。 實現檔案中,即類的實現程式碼中可以使用obj-c的東西,可以import,只是字尾是mm。如果模組以函式實現,那麼標頭檔案要按 c的格 式宣告函式,實現檔案中,c++函式內部可以用obj-c,但字尾還是mm或m。總結:只要cpp檔案和cpp include的檔案中不包含 obj-c的東西就可以用了,cpp混用obj-c的關鍵是使用介面,而不能直接使用實現程式碼,實際上cpp混用的是obj-c編譯後的o文 件,這個東西其實是無差別的,所以可以用。obj-c的編譯器支援cpp。

36、舉出5個以上你所熟悉的ios sdk庫有哪些和第三方庫有哪些? 1)ios-sdk: Foundation.framework,CoreGraphics.framework,UIKit.framework, MediaPlayer.framework, CoreAudio.framework 2)第三方庫: 1.json編碼解碼;2.ASIHTTPRequest等相關協議封裝;3.EGORefreshTableHeaderView下拉重新整理程式碼;4.AsyncImageView 非同步載入圖片並快取;5.SDWebImage——簡化網路圖片處理

37、objc優缺點----OC的特點:id型別,動態 objc優點: 1)Cateogies 2)Posing 3)動態識別 4)指標計算 5)彈性訊息傳遞 6)不是一個過度複雜的C衍生語言 7)Objective-C與C++可混合程式設計 缺點: 1)不支援名稱空間 2)不支援運算子過載 3)不支援多重繼承 4)使用動態執行時型別,所有的方法都是函式呼叫,所以很多編譯時優化 方法都用不到。(如行內函數等),效能低劣。

38、UITableView的重用機制?如何在一個view上顯示多個tableView,tableView要求不同的資料來源以及不同的樣 式 (要求自定義cell), 如何組織各個tableView的delegate和dataSource?請說說實現思路?在一個tableView 中需要自定義多種樣式的cell(兩種或三種),通常你如何實現,說說思路即可?UITableView的那些元素是可以自 定義的? UITableView的重用機制: 檢視UITableView標頭檔案,會找到NSMutableArrayvisiableCells,和NSMutableArrayreusableTableCells兩 個結構。visiableCells內儲存當前顯示的cells,reusableTableCells儲存可重用的cells。 TableView顯示之初,reusableTableCells為空,那麼 tableView dequeueReusableCellWithIdentifier:CellIdentifier返回nil。開始的cell都 是通過 [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] 來創 建,而且cellForRowAtIndexPath只是呼叫最大顯示cell數的次數。 比如:有100條資料,iPhone一屏最多顯示10個cell。程式最開始顯示TableView的情況是:

  1. 用[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] 建立10次cell,並給cell指定同樣的重用標識(當然,可以為不同顯示型別的cell指定不同的標識)。並且10個cell全部都加 入到 visiableCells陣列,reusableTableCells為空。
  2. 向下拖動tableView,當cell1完全移出螢幕,並且 cell11(它也是alloc出來的,原因同上)完全顯示出來的時候。 cell11加入到visiableCells,cell1移出 visiableCells,cell1加入到reusableTableCells。
  3. 接著向下拖動tableView,因為reusableTableCells中已 經有值,所以,當需要顯示新的cell, cellForRowAtIndexPath再次被呼叫的時 候, tableView dequeueReusableCellWithIdentifier:CellIdentifier,返回cell1。 cell1加入到visiableCells,cell1 移出reusableTableCells;cell2移出 visiableCells,cell2加入到reusableTableCells。之後再需要顯示的Cell就可 以正常重用了

39、一個tableView是否可以關聯兩個不同的資料來源?你會怎麼處理? 首先從程式碼來看,資料來源如何關聯上的,其次是在資料來源關聯的代理方法裡實現的。 - (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath { if(indexPath.section == 0) {} if(indexPath.section == 1) {} }

40、OC中有哪些資料儲存方式,各有什麼區別? 四種儲存方式: 1.NSUserDefaults,用於儲存配置資訊 2.SQLite,用於儲存查詢需求較多的資料 3.CoreData,用於規劃應用中的物件 4.使用基本物件型別定製的個性化快取方案. NSUserDefaults:物件中儲存了系統中使用者的配置資訊,開發者可以通過這個例項物件對這些已有的資訊進行修改,也可以按照自己的需求建立新的配置項。 SQLite擅長處理的資料型別其實與NSUserDefaults差不多,也是基礎型別的小資料,只是從組織形式上不同。開發者可 以以關係型資料庫的方式組織資料,使用SQL DML來管理資料。一般來說應用中的格式化的文字類資料可以存放在資料庫 中,尤其是類似聊天記錄、Timeline等這些具有條件查詢和排序需求的資料。 CoreData是一個管理方案,它的持久化可以通過SQLite、XML或二進位制檔案儲存。它可以把整個應用中的物件建模並進 行自動化的管理。從歸檔檔案還原模型時CoreData並不是一次性把整個模型中的所有資料都載入記憶體,而是根據執行時狀 態,把被呼叫到的物件例項載入記憶體。框架會自動控制這個過程,從而達到控制記憶體消耗,避免浪費。 無論從設計原理還是使用方法上看,CoreData都比較複雜。因此,如果僅僅是考慮快取資料這個需求,CoreData絕對不 是一個優選方案。CoreData的使用場景在於:整個應用使用CoreData規劃,把應用內的資料通過CoreData建模,完全 基於CoreData架構應用。 使用基本物件型別定製的個性化快取方案:從需求出發分析快取資料有哪些要求:按Key查詢,快速讀取,寫入不影響正常 操作,不浪費記憶體,支援歸檔。這些都是基本需求,那麼再進一步或許還需要固定快取項數量,支援佇列快取,快取過期 等。

41、ios平臺怎麼做資料的持久化?coredata和sqlite有無必然聯絡?coredata是一個關係型資料庫嗎? iOS中可以有四種持久化資料的方式: 屬性列表、物件歸檔、SQLite3和Core Data coredata可以使你以圖形介面的方式快速的定義app的資料模型,同時在你的程式碼中容易獲取到它。coredata提供了基礎結構去處 理常用的功能,例如儲存,恢復,撤銷和重做,允許你在app中繼續建立新的任務。在使用coredata的時候,你不用安裝額外的資料 庫系統,因為coredata使用內建的sqlite資料庫。coredata將你app的模型層放入到一組定義在記憶體中的資料物件。coredata會 追蹤這些物件的改變,同時可以根據需要做相應的改變,例如使用者執行撤銷命令。當coredata在對你app資料的改變進行儲存的時 候,core data會把這些資料歸檔,並永久性儲存。 mac os x中sqlite庫,它是一個輕量級功能強大的關係資料引擎,也很容易嵌入到應用程式。可以在多個平臺使用,sqlite是一個輕 量級的嵌入式sql資料庫程式設計。與coredata框架不同的是,sqlite是使用程式式的,sql的主要的API來直接運算元據表。 Core Data不是一個關係型資料庫,也不是關係型資料庫管理系統(RDBMS)。雖然Core Dta支援SQLite作為一種儲存型別, 但它不能使用任意的SQLite資料庫。Core Data在使用的過程種自己建立這個資料庫。Core Data支援對一、對多的關係。

42、OC中的數字物件都有哪些,簡述它們與基本資料型別的區別是什麼 Objective-C中的數字物件NSNumber; Objective-C中的基本型別和C語言中的基本型別一樣.主要有:int,long,float,double,char,void,bool等. 對於基本型別變數,不需要用指標,也不用手動回收,方法執行結束會自動回收.數字物件需要指標,也需要手動回收記憶體。

43、什麼是動態識別,動態繫結?延展--程式的編譯過程

44、單件例項是什麼? Foundation 和 Application Kit 框架中的一些類只允許建立單件物件,即這些類在當前程式中的唯一例項。舉例來說, NSFileManager 和NSWorkspace 類在使用時都是基於程式進行單件物件的例項化。當向這些類請求例項的時候,它們 會向您傳遞單一例項的一個引用,如果該例項還不存在,則首先進行例項的分配和初始化。單件物件充當控制中心的角色, 負責指引或協調類的各種服務。

45、如何將產品進行多語言釋出? 程式國際化; 比如:本地化應用程式名稱 (1、選中工程,Info—Localizations點選“+”新增要國際化的語言。 (2、在InfoPlist.strings右邊會多出一個三角形,點選展開可看到InfoPlish.strings(english)和 InfoPlish.strings(chinese)兩個版本的檔案; (3、在InfoPlish.strings(english)檔案中加入: CFBundleDisplayName ="Program"; 其中“Program”為英文應用程式名稱,同理在InfoPlish.strings(chinese)檔案中加入: CFBundleDisplayName ="應用程式"; 其中“應用程式”為中文名稱,注意:CFBundleDisplayName加不加雙引號都行; (4、編輯Info.plist,新增一個新的屬性Application has localized display name, 設定其型別為boolean,並將其 value設定為YES即可。

46、什麼是動態連結庫和靜態連結庫?呼叫一個類的靜態方法需不需要release? 程式的編譯過程--連結--- 靜態連線庫就是把(lib)檔案中用到的函式程式碼直接連結進目標程式,程式執行的時候不再需要其它的庫檔案;動態連結就是 把呼叫的函式所在檔案模組 (DLL)和呼叫函式在檔案中的位置等資訊連結進目標程式,程式執行的時候再從DLL中尋找 相應函式程式碼,因此需要相應DLL檔案的支援。 靜態連結庫和動態連結庫的另外一個區別在於靜態連結庫中不能再包含其他的動態連結庫或者靜態庫,而在動態連結庫中還 可以再包含其他的動態或靜態連結庫。 動態的是:執行時才載入到記憶體中,靜態:編譯時就載入到記憶體中 靜態方法也就是類方法,不需要release

47、宣告一個靜態方法和一個例項方法? 解釋:就是類方法和物件方法,

48、什麼是push?遠端推送? 第一步:UIApplication向APNS註冊push notification服務 1、應用程式 要支援 推送服務(在網頁裡配置) (1)https://developer.apple.com/devcenter/ios/index.action (2)登入 蘋果開發者賬號(注意是收費賬號,$99或$299) (3)下載push證照(主要是給程式簽名,push服務只有收費開發者才具備。所以需要簽名驗證),如果沒有 push證照,建立一個push證照(App ID->鑰匙串程式生成request->push證照)注意事項:App ID的 Bundle ID必須和程式plist檔案裡的Bundle identifier一致。App ID一旦生成,將不可修改。 (4)把證照安裝到鑰匙串裡(雙擊證照檔案) (5)生成 編譯程式 用的描述檔案(網頁裡進行) 2、向APNS註冊push服務(UIApplication的registerForRemoteNotificationTypes:方法) 第二步 獲取APNS分配的DeviceToken(64位16進位制串)

  • (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken 第三步 把DeviceToken傳送給自己的後臺伺服器,伺服器記錄每臺裝置的DeviceToken以便日後推送資訊給客 戶端。(需要有一個網路介面,讓客戶端傳送DeviceToken) 第四步 伺服器推送資訊給客戶端 1、伺服器除了需要有客戶端的DeviceToken之外,還要有push證照,對push的內容進行簽名。(蘋果為了防 止 惡意向客戶端(比如DeviceToken洩露了)傳送訊息,每次推送訊息,都需要證照進行簽名,從而避免黑客惡 意攻擊使用者手機。) 2、如果你的伺服器是java寫的,可以直接使用鑰匙串匯出的p12檔案(證照和金鑰一起匯出)。如果你的伺服器 是php寫的,因為php語言不支援p12檔案型別,需要轉換為pem檔案。 3、將p12轉換為pem檔案:終端 先找到你p12所在的目錄 openssl pkcs12 -in CertificateName.p12 - outCertificateName.pem -nodes 4、伺服器傳送資訊給APNS,APNS自動將資訊推送給客戶端 第五步 客戶端處理收到的資訊
  • (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo 注意事項 1、測試版的push證照僅僅用於開發期間測試,釋出版的程式需要生成一個釋出版的push證照。 2、測試版APNS的ssl地址和釋出版的ssl地址不同 3、測試版的DeviceToken和釋出版的DeviceToken也不同 4、php檔案要喝pem檔案放在同一目錄。 5、除了alert sound和badge之外,json串裡還可以包含自定義資訊。 6、推送的資訊最大255位元組 7、推送的資訊受網路影響較大,有可能造成延遲甚至丟失,重要資訊的傳遞不應該使用push通知,應該有專門的 後臺介面。 8、藉助push推送,兩個客戶端可以實現即時通訊,工程裡面存放我們的p12檔案,客戶端自己組織json串,發 送請求到APNS。

49、什麼是沙箱模型?哪些操作是屬於私有api範疇? 某個iphone工程進行檔案操作有此工程對應的指定的位置,不能逾越。 iphone常見私有api的應用(比如直接傳送簡訊,訪問沙箱之外的磁碟檔案).

50、如何將敏感字變成** 延展---幾個字變為幾個*如何實現? 呼叫stringByReplacingOccurrencesOfString:withString:給定字串,指定替換字,替換** 51、iphone閱讀器,如果要讀取一個文字檔案,請問你是如何處理編碼問題的?另外像pdf格式的檔案,你如何讀 取? 首先檢測文字編碼格式(只需讀取小部分用來判斷), iphone手機閱讀器中對於PDF格式的閱讀,可以直接用UIWebView控制元件顯示,也可以從網上下到很多直接讀取pdf格式 的程式碼 直接從pdf中得到資料。複雜表格動畫- (void)insertRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation; -(void)deleteRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation: (UITableViewRowAnimation)animation;- (void)reloadRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation;

52、在開發大型專案的時候,如何進行記憶體洩露檢測的? 記憶體洩露怎麼處理? 如何檢測記憶體洩露: 可以通過xcode的自帶工具run---start with performance tool裡有instruments下有個leaks工具,啟動此工具 後,執行專案,工具裡可以顯示記憶體洩露的情況,雙擊可找到原始碼位置,可以幫助進行記憶體洩露的處理。 如何處理:先定位到具體位置, 再解決之。

53、iphone app為什麼會被打回來,如何制止? app的設定介面、按鈕使用了類似iphone的操作方式以及icon的圓角設計 -> 重新設計⋯ app的年齡設定太低 -> 改了年齡⋯ app裡有實物獎勵 -> 免責宣告,和蘋果無關⋯ app描述裡提了後續版本的功能的字樣 -> 刪除⋯ app有打分的功能 -> 有reject的,也有通過的⋯ app需要使用location,沒有提示使用者 -> 加了提示,允許使用者拒絕⋯ app沒提供測試賬號 -> 提供⋯ app裡有私有api -> 修改⋯ 應用內含有有某公司LOGO的圖片,沒有該公司授權檔案,被拒-> 修改⋯ 第三方靜態庫包含私有api的呼叫(聯絡第三方技術支援,更新靜態庫); 包含潛在的色情,暴力等內容(調整應用年齡限制等級,並加入舉報功能) 做瀏覽器的,分級必須選17+

54、iphone應用程式的專案基本結構? · Classes -> 源程式檔案(.h、.m) · Other Sources-> main.m 等,不需要程式設計師修改 -Prefix.pch · Resources -> 介面檔案(.xib)、配置檔案-info.plist · Frameworks -> 連結的庫· Targets -> 專案的不同Target(資源、編譯配置不同) · Executables -> 專案中所有的可執行檔案 -Prefix.pch:_Prefix為所有的專案程式檔案預先配置執行環境的字首標頭,在程式執行之前,引入所需框架中的(.h)頭文 件。這樣可以減少每個標頭檔案對程式編譯做出相同的定義,在巨型的應用程式專案開發中節省大量的時間,例如,程式有 100個根檔案需要定義abc.h,只需要在_Preix.pch檔案下建立一個物件,所有的根檔案便可以重複地對程式編譯做出定 義。

55、請寫出程式碼,用blocks來取代上例中的protocol,並比較兩種方法的優勢。實際應用部分?請寫出程式碼,用 blocks取代協議或回撥方法

56、你做iphone開發時候,有哪些傳值方式,view和view之間是如何傳值的? block, target-action ,代理,屬性,

57、給定的一個字串,判斷字串中是否還有png,有就刪除它? NSMutableString *mstr=[NSMutableString stringWithFormat:@"ccc"]; NSRange substr = [mstr rangeOfString:@"png"]; //字串查詢,可以判斷字串中是否有 if (substr.location != NSNotFound) { [mstr deleteCharactersInRange:substr]; }

58、編譯語言和解釋語言的區別 區別:C語言,OC語言屬於編譯語言;解釋語言:也可以理解為指令碼檔案,不需要編譯, 編譯型語言寫的程式執行之前,需要一個專門的編譯過程,把程式編譯成為機器語言的檔案,比如exe檔案,以後要執行的 話就不用重新翻譯了,直接使用編譯的結果就行了(exe檔案),因為翻譯只做了一次,執行時不需要翻譯,所以編譯型語 言的程式執行效率高,但也不能一概而論,部分解釋型語言的直譯器通過在執行時動態優化程式碼,甚至能夠使解釋型語言的 效能超過編譯型語言。 解釋則不同,解釋性語言的程式不需要編譯,省了道工序,解釋性語言在執行程式的時候才翻譯, 比如解釋性basic語言,專門有一個直譯器能夠直接執行basic程式,每個語句都是執行的時候才翻譯。這樣解釋性語言每 執行一次就要翻譯一次,效率比較低。解釋是一句一句的翻譯。

59、對於語句NSString* testObject = [[NSData alloc] init];testObject 在編譯時和執行時分別是什麼型別的對 象? 編譯時是NSString,執行時是NSDate

60、給使用者推送的通知的虛擬碼

61、ViewController的 loadView, viewDidLoad,viewWillAppear,viewDidUnload,dealloc、init分別是在什麼時 候呼叫的?在自定義ViewController的時候這幾個函式裡面應該做什麼工作? 1、viewDidLoad 此方法只有當view從nib檔案初始化的時候才被呼叫 2、viewDidUnload當系統記憶體吃緊的時候會呼叫該方法,在該方法中將所有IBOutlet(無論是property還是例項變數) 置 為nil(系統release view時已經將其release掉了)在該方法中釋放其他與view有關的物件、其他在執行時建立(但 非系統必須)的物件、在viewDidLoad中 被建立的物件、快取資料等 release物件後,將物件置為nil(IBOutlet只需要 將其置為nil,系統release view時已經將其release掉了) dealloc方法,viewDidUnload和dealloc方法沒有關聯,dealloc還是繼續做它該做的事情 流程應該是這樣: (loadView/nib檔案)來載入view到記憶體 -->viewDidLoad函式進一步初始化這些view -->記憶體不足時,呼叫 viewDidUnload函式釋放views -->當需要使用view時有回到第一步 如此迴圈 4、viewWillAppear方法,檢視即將過渡到螢幕上時呼叫,(一般在返回需要重新整理頁面時,我都選擇使用代理,所以很少用到) 5、viewWillDisappear方法,這個A->B之後,A在B之後的操作

62、描述程式啟動的順序 1、main.m是程式的入口 2、UIApplicationMain()建立應用程式物件,並且為此物件指定委託,檢測程式的執行,同時開啟事件迴圈,處理程式接收到的事 件 3、UIApplicationDelegate方法的執行 4、載入window 5、指定根檢視控制器 6、在指定的試圖控制器中新增控制元件,實現應用程式介面

63、OC中是所有物件間的互動是如何實現的? 通過指標實現的

64、objective-c中的型別轉換分為哪幾類? 可變與不可變之間的轉化; 可變與可變之間的轉化; 不可變與不可變之間。

65、獲取專案根路徑,並在其下建立一個名稱為userData的目錄? // 獲取根路徑 NSArray *paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:]; // 建立檔案系統管理器 NSFileManager *fileManager = [[NSFileManager alloc] init]; // 判斷userData目錄是否存在 if(![fileManager fileExistsAtPath:[NSString stringWithFormat:@"%@/userData", documentsDirectory]]) { // 不存在,建立一個userData目錄 [fileManager createDirectoryAtPath:[NSString stringWithFormat:@"%@/userData", documentsDirectory]withIntermediateDirectories:false attributes:nil error:nil]; }

66、目標-動作機制 目標是動作訊息的接收者。一個控制元件,或者更為常見的是它的單元,以插座變數的形式保有其動作訊息的目標。 動作是控制元件傳送給目標的訊息,或者從目標的角度看,它是目標為了響應動作而實現 的方法。 程式需要某些機制來進行事件和指令的 翻譯。這個機制就是目標-動作機制。 參考target-action

67、淺複製和深複製的區別? 淺層複製(copy):只複製指向物件的指標,而不復制引用物件本身。//通過物件的指標來訪問這個物件----只賦值地址 深層複製(mutableCopy):複製引用物件本身---再建立一個物件 意思就是有個A物件,複製一份後得到A_copy物件後,對於淺複製來說,A和A_copy指向的是同一個記憶體資源,複製的 只不過是是一個指標,物件本身資源 還是隻有一份,那如果我們對A_copy執行了修改操作,那麼發現A引用的物件同樣被修改,這其實違背了我們複製拷貝的一 個思想。深複製就好理解了,記憶體中存在了 兩份獨立物件本身。//當修改A時,A copy不變。

68、obc中可修改和不可以修改型別 可修改不可修改的集合類。這個我個人簡單理解就是可動態新增修改和不可動態新增修改一樣。比如NSArray和 NSMutableArray。前者在初始化後的記憶體控制元件就是固定不可變的,後者可以新增等,可以動態申請新的記憶體空間。

69、什麼是安全釋放? [_instance release],_instance = nil;

70、類變數的@protected ,@private,@public,@package宣告各有什麼含義? 變數的作用域不同,@protected 該類和所有子類中 的方法可以直接訪問這樣的變數,這是預設的; @private 該類中的方法可以訪問這樣的變數,子類不可以; @public除了自己和子類方法外,也可以被其他類或者其他模組中的方法訪問; @package 目前尚未得出結論

71 OC中異常exception 怎麼捕獲?不同的CPU結構上開銷怎樣?C中又什麼類似的方法? 瞭解一下異常捕獲 CPU的開銷:

72、關於Objective-C++中的異常處理,可以相互捕獲到嗎? 不可以;

73、for(int index = 0; index < 20; index ++){NSString *tempStr = @”tempStr”;NSLog(tempStr);NSNumber *tempNumber = [NSNumber numberWithInt: 2];NSLog(tempNumber);}這段程式碼有什麼問題.?會不會造成記憶體洩露(多執行緒)?在記憶體緊張的裝置上做大 迴圈時自動釋放池是寫在迴圈內好還是迴圈外好?為什麼?

74、什麼是序列化或者Acrchiving,可以用來做什麼,怎樣與copy結合,原理是什麼?. 序列化就是:歸檔

75、runloop是什麼?在主執行緒中的某個函式裡呼叫了非同步函式,怎麼樣block當前執行緒,且還能響應當前執行緒的 timer事件,touch事件等.---NSRunLoop,NSTimer需要自己實現----GCD的返回主執行緒的方法,看前面的題 run loop,正如其名稱所示,是執行緒進入和被執行緒用來響應事件以及呼叫事件處理函式的地方。需要在程式碼中使用控制語句實現run loop的迴圈,也就是說,需要程式碼提供while 或者 for迴圈來驅動run loop。在這個迴圈中,使用一個 runloop物件[NSRunloop currentRunloop]執行接收訊息,呼叫對應的處理函式。

76、描述下拉重新整理的實現機制? 獲取資料,重新整理頁面

77、什麼是沙盒?沙盒包含哪些檔案,描述每個檔案的使用場景。如何獲取這些檔案的路徑?如何獲取應用程式包 中檔案的路徑? 沙盒是某個iphone工程進行檔案操作有此工程對應的指定的位置,不能逾越。 包括:四個資料夾:documents,tmp,app,Library。 手動儲存的檔案在documents檔案裡。 Nsuserdefaults儲存的檔案在tmp資料夾裡。 Documents 目錄:您應該將所有de應用程式資料檔案寫入到這個目錄下。這個目錄用於儲存使用者資料或其它應該定期備 份的資訊。AppName.app 目錄:這是應用程式的程式包目錄,包含應用程式的本身。由於應用程式必須經過簽名,所以 您在執行時不能對這個目錄中的內容進行修改,否則可能會使應用程式無法啟動。Library 目錄:這個目錄下有兩個子目 錄:Caches 和 PreferencesPreferences 目錄包含應用程式的偏好設定檔案。您不應該直接建立偏好設定檔案,而是 應該使用NSUserDefaults類來取得和設定應用程式的偏好.Caches 目錄用於存放應用程式專用的支援檔案,儲存應用程 序再次啟動過程中需要的資訊。tmp 目錄:這個目錄用於存放臨時檔案,儲存應用程式再次啟動過程中不需要的資訊。 獲取這些目錄路徑的方法: 1,獲取家目錄路徑的函式: NSString *homeDir = NSHomeDirectory(); 2,獲取Documents目錄路徑的方法: NSArray *paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *docDir = [paths objectAtIndex:0]; 3,獲取Caches目錄路徑的方法: NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); NSString *cachesDir = [paths objectAtIndex:0]; 4,獲取tmp目錄路徑的方法: NSString *tmpDir = NSTemporaryDirectory(); 5,獲取應用程式程式包中資原始檔路徑的方法: 例如獲取程式包中一個圖片資源(apple.png)路徑的方法: NSString *imagePath = [[NSBundle mainBundle] pathForResource:@”apple” ofType:@”png”]; UIImage *appleImage = [[UIImage alloc] initWithContentsOfFile:imagePath]; 程式碼中的mainBundle類方法用於返回一個代表應用程式包的物件。

78、介紹一下XMPP?有什麼優缺點嗎? XMPP(Extensible Messaging and Presence Protocol,前稱)是一種以XML為基礎的開放式實時通訊協議,是 經由網際網路工程工作小組(IETF)通過的網際網路標準。簡單的說,XMPP就是一種協議,一種規定。就是說,在網路上傳 東西,要建立連線,TCP/IP連線,建立後再傳東西,而XMPP就是規定你傳的東西的格式。XMPP是基於XML的協議。 優點 開放: XMPP協議是自由、開放、公開的,並且易於瞭解。 而且在客戶端 、 伺服器 、 元件 、 原始碼庫等方面,都已經各自有多種實現。 標準: 網際網路工程工作小組( IETF )已經將Jabber的核心XML流協議以XMPP之名,正式列為認可的實時通訊及Presence技術。 而XMPP的技術規格已被定義在RFC 3920及RFC 3921 。 任何IM供應商在遵循XMPP協議下,都可與Google Talk實現連線。 證實可用: 第一個Jabber(現在XMPP)技術是Jeremie Miller在1998年開發的,現在已經相當穩定;數以百計的開發者為XMPP技術而努 力。 今日的網際網路上有數以萬計的XMPP伺服器運作著,並有數以百萬計的人們使用XMPP實時傳訊軟體。 分散式: XMPP網路的架構和電子郵件十分相像;XMPP核心協議通訊方式是先建立一個stream,XMPP以TCP傳遞XML資料流,沒有 中央主伺服器。 任何人都可以執行自己的XMPP伺服器,使個人及組織能夠掌控他們的實時傳訊體驗。 安全: 任何XMPP協議的伺服器可以獨立於公眾XMPP網路(例如在企業內部網路中),而使用SASL及TLS等技術的可靠安全性,已自 帶於核心XMPP技術規格中。 可擴充套件: XML 名稱空間的威力可使任何人在核心協議的基礎上建造定製化的功能;為了維持通透性,常見的擴充套件由XMPP標準基金會 。 彈性佳: XMPP除了可用在實時通訊的應用程式,還能用在網路管理、內容供稿、協同工具、檔案共享、遊戲、遠端系統監控等。 多樣性: 用XMPP協議來建造及佈署實時應用程式及服務的公司及開放原始碼計劃分佈在各種領域;用XMPP技術開發軟體,資源及支援的 來源是多樣的,使得使你不會陷於被“綁架”的困境。 缺點 資料負載太重: 隨著通常超過70%的XMPP協議的伺服器的資料流量的存在和近60%的被重複轉發,XMPP協議目前擁有一個大型架空中存在的 資料提供給多個收件人。 新的議定書正在研究,以減輕這一問題。 沒有二進位制資料: XMPP協議的方式被編碼為一個單一的長的XML檔案,因此無法提供修改二進位制資料。 因此, 檔案傳輸協議一樣使用外部的 HTTP。 如果不可避免,XMPP協議還提供了帶編碼的檔案傳輸的所有資料使用的Base64 。 至於其他二進位制資料加密會話 (encrypted conversations)或圖形圖示(graphic icons)以嵌入式使用相同的方法。

79、談談對效能優化的看法,如何做? 控制好記憶體,不用的記憶體實時釋放;冗餘程式碼;使用者體驗度;耗時操作,開執行緒進行處理

80、寫一個遞迴方法:計算N的階乘,然後將計算結果進行儲存。以便應用退出後下次啟動可直接獲取該值。 開啟一個執行緒,線上程種實現遞迴的方法,將結果存到本地,下次執行時先看本地,沒有在執行這個遞迴方法。-- ---用程式碼實現----

81、簡述應用程式按Home鍵進入後臺時的生命週期,和從後臺回到前臺時的生命週期? 應用程式: -[AppDelegate application:willFinishLaunchingWithOptions:] -[AppDelegate application:didFinishLaunchingWithOptions:] -[AppDelegate applicationDidBecomeActive:] 退到後臺: -[AppDelegate applicationWillResignActive:] -[AppDelegate applicationDidEnterBackground:] 回到前臺: -[AppDelegate applicationWillEnterForeground:] -[AppDelegate applicationDidBecomeActive:] ViewController之間 載入頁面: -[mainViewController viewDidLoad] -[mainViewController viewWillAppear:] -[mainViewController viewWillLayoutSubviews] -[mainViewController viewDidLayoutSubviews] -[mainViewController viewDidAppear:] 退出當前頁面: -[mainViewController viewWillDisappear:] -[mainViewController viewDidDisappear:] 返回之前頁面: -[mainViewController viewWillAppear:] -[mainViewController viewWillLayoutSubviews] -[mainViewController viewDidLayoutSubviews] -[mainViewController viewDidAppear:]

82、簡述值傳遞和引用傳遞的區別? 所謂值傳遞,就是說僅將物件的值傳遞給目標物件,就相當於copy;系統將為目標物件重新開闢一個完全相同的記憶體空間。 所謂引用傳遞,就是說將物件在記憶體中的地址傳遞給目標物件,就相當於使目標物件和原始物件對應同一個記憶體儲存空間。此時,如 果對目標物件進行修改,記憶體中的資料也會改變。

83、NSArray和NSMutableArray的區別,多執行緒操作哪個更安全? NSArray更安全,當同時被訪問時,NSArray是不可改變

84、當前有一個陣列,裡面有若干重複的資料,如何去除重複的資料?(會幾個寫幾個) 可以由陣列,到集合。。。。

85、isKindOfClass、isMemberOfClass、selector作用分別是什麼 isKindOfClass,作用是,某個物件屬於某個型別,包括繼承的型別--- isMemberOfClass:某個物件確切屬於某個型別,是不是具體的例項 selector:通過方法名,獲取在記憶體中的函式的入口地址

86、寫出下面程式段的輸出結果 NSDictionary *dict = [NSDictionary dictionaryWithObject:@"a string value" forKey:@"akey"]; NSLog(@"%@", [dict objectForKey:@"akey"]); [dict release]; 列印輸出 a string value,然後崩潰----原因:便利構造器建立的物件,之後的release,會造成過度釋放

87、請寫出以下程式碼的執行結果 NSString * name = [ [ NSString alloc] init ]; name = @”Habb”; [ name release]; 列印輸出結果是: Habb,在[name release]前後列印均有輸出結果 ---會造成記憶體洩露---原先指向的區域變成了野指標,之後的釋放,不能釋放之前建立的區域

88、請分別寫出SEL、id、@的意思? SEL是“selector”的一個型別,表示一個方法的名字-------就是一個方法的入口地址 id是一個指向任何一個繼承了Object(或者NSObject)類的物件。需要注意的是id是一個指標,所以在使用id 的時候不需要加*。 @:OC中的指令符

89、以.mm為擴充名的檔案裡,可以包含的程式碼有哪些? .mm是oc和C++混編型別檔案字尾,給編譯器識別的。

90、說說如何進行後臺執行程式? 答:判斷是否支援多執行緒 UIDevice* device = [UIDevice currentDevice]; BOOL backgroundSupported = NO; if ([device respondsToSelector:@selector(isMultitaskingSupported)]) backgroundSupported = device.multitaskingSupported; 宣告你需要的後臺任務Info.plist中新增UIBackgroundModes鍵值,它包含一個或多個string的值,包括audio:在後臺提供聲音 播放功能,包括音訊流和播放視訊時的聲音 location:在後臺可以保持使用者的位置資訊 voip:在後臺使用VOIP功能 前面的每個value讓系統知道你的應用程式應該在適當的時候被喚醒。例如,一個應用程式,開始播放音樂,然後移動到後臺仍然需要 執行時間,以填補音訊輸出緩衝區。新增audio鍵用來告訴系統框架,需要繼續播放音訊,並且可以在合適的時間間隔下回撥應用程式;如果應用程式不包括此項,任何音訊播放在移到後臺後將停止執行。除了新增鍵值的方法,IOS還提供了兩種途徑使應用程式在後臺工作: Task completion—應用程式可以向系統申請額外的時間去完成給定的任務 Local notifications—應用程式可以預先安排時間執行local notifications 傳遞實現長時間的後臺任務:應用程式可以請求在後臺執行以實現特殊的服務。這些應用程式並不連續的執行,但是會被系統框架在合適的時間喚醒,以實現這些服務

91、你瞭解svn,cvs等版本控制工具麼? 版本控制 svn,cvs 是兩種版控制的器,需要配套相關的svn,cvs伺服器。scm是xcode裡配置版本控制的地方。版本控制 的原理就是a和b同時開發一個專案,a寫完當天的程式碼之後把程式碼提交給伺服器,b要做的時候先從伺服器得到最新版本, 就可以接著做。 如果a和b都要提交給伺服器,並且同時修改了同一個方法,就會產生程式碼衝突,如果a先提交,那麼b提交 時,伺服器可以提示衝突的程式碼,b可以清晰的看到,並做出相應的修改或融合後再提交到伺服器。

相關文章