新手開發IOS的疑惑

2021-06-19 16:03:21 字數 2851 閱讀 5304

1.prefix.pch 是做什麼用的?

是乙個加快編譯速度的工具。只有永遠不會變化或很少發生變化的標頭檔案才能被新增到字首檔案中。這樣做可以使框架的**提前編譯,並對所有類可見。但是,如果新增到字首檔案中的標頭檔案發生變化,那麼所有的**會被重新編譯,這也是為什麼只能向字首檔案新增不變檔案的原因。

2.if((self = [super init])) 為什麼會這麼寫?

- (id) init

return self;

}

在 self = [super init] 的呼叫中,self被賦值為向父物件傳送 init 訊息後的返回值。如果你之前是一名c++程式設計師,看到這一幕一定會感到痛苦萬分。請不必太過沮喪。這行**表示:在objective-c中,我們必須手動呼叫父類的 init 方法,改操作不會自動完成。我們之所以用 self 來接受返回值,是為了防止返回值為 nil 的情況發生。

如果你無法很好的理解objective-c程式設計師呼叫[super init]的方式,另一種方法也許能令你比較容易接受。這種方式基本上和上面的方法一樣,但它也是有別於傳統的寫法的:

- (id) init

return self;

}

3.ios目前版本的記憶體管理差異

ios6.0以前版本

uiviewcontroller 增加了 viewdidunload 方法。該方法和 viewdidload 相配對。當系統記憶體不足時,首先 uiviewcontroller 的 didreceivememorywarining 方法會被呼叫,而 didreceivememorywarining 會判斷當前 viewcontroller 的 view 是否顯示在 window 上,如果沒有顯示在 window 上,則 didreceivememorywarining 會自動將 viewcontroller 的view 以及其所有子  view全部銷毀,然後呼叫 viewcontroller 的 viewdidunload 方法。如果當前 uiviewcontroller 的 view 顯示在 window 上,則不銷毀該 viewcontroller 的 view,當然,viewdidunload 也不會被呼叫了。

收到記憶體警告:呼叫 didreceivememorywarning 內呼叫 super 的 didreceivememorywarning 會將 controller 的 view 進行釋放。所以我們不能將controller的view再次釋放。

處理方法:

-(void)didreceivememorywarning

-(void)viewdidunload

但是到了ios 6.0之後,這裡又有所變化,ios 6.0記憶體警告的 viewdidunload 被遮蔽,即又回到了ios 6.0以前版本時期的記憶體管理方式。   

收到記憶體警告:呼叫 didreceivememorywarning 內呼叫 super 的 didreceivememorywarning 調只是釋放 controller 的 resouse,不會釋放view。

處理方法:

-(void)didreceivememorywarning

}

4.訊息排程 @selector

看到 @selector(...) 語句的時候可能覺得有些陌生,這在 objective-c 中用來指定某個特定方法。關鍵在於,絕不能忘記函式後面的冒號!冒號告訴 objective-c:「去找乙個名為***的方

法,這個方法有且只有乙個引數」。如果忘記寫冒號,編譯器還是可以通過的,但是程式一執行就會發生崩潰。在 debugger console 視窗中,你會看到這樣的錯誤日誌:「unrecoginized  

selector sent to instance...」。

@selector(...) 中的冒號個數一定要與所指定的方法引數個數相同。例如:

- (void) example:(cctime)delta sender:(id)sender flag:(bool)abool
那麼,對應的@selector語句就應該是:

@selector(example:sender:flag:);
不論是在排程訊息時還是在其他情況下使用 @selector(...), 都需要注意乙個很重要的問題:在預設情況下,如果方法名不存在,編譯器並不會報錯;但是,一旦程式執行時呼叫用了指向不存在的方法的 @selector 語句,應用程式就會立即崩潰。由於這個呼叫是在內部完成的,所以很難找到問題所在。好在,xcode可以設定來強制編譯器報錯。

如圖:

5.#import與@class的區別

1.import會包含這個類的所有資訊,包括實體變數和方法,而@class只是告訴編譯器,其後面宣告的名稱是類的名稱,至於這些類是如何定義的,暫時不用考慮,後面會再告訴你。

2.在標頭檔案中, 一般只需要知道被引用的類的名稱就可以了。 不需要知道其內部的實體變數和方法,所以在標頭檔案中一般使用@class來宣告這個名稱是類的名稱。 而在實現類裡面,因為會用到這個引用類的內部的實體變數和方法,所以需要使用#import來包含這個被引用類的標頭檔案。

4.如果有迴圈依賴關係,如:a–>b, b–>a這樣的相互依賴關係,如果使用#import來相互包含,那麼就會出現編譯錯誤,如果使用@class在兩個類的標頭檔案中相互宣告,則不會有編譯錯誤出現。

所以,一般來說,@class是放在inte***ce中的,只是為了在inte***ce中引用這個類,把這個類作為乙個型別來用的。 在實現這個介面的實現類中,如果需要引用這個類的實體變數或者方法之類的,還是需要import在@class中宣告的類進來.

iOS新手開發總結

近期參與乙個ios平台上的小應用 怡情體育 功能主要是提供最新的各大體育聯賽的新聞 直播等,並有使用者管理帶有一定的社交功能。實現起來也比較簡單,伺服器爬到資料放在資料庫中,移動客戶端通過webservice soap 向伺服器傳送請求得到返回資料並顯示。首先介紹下開發過程中用到或者了解的一些開源 ...

新手單元測試的疑惑

1 nunit於vs的ide整合不好,老是在ide和nunit之間換來換去,而且每次執行nunit都要重新run一下。我個人覺得這個不是問題,經過我的小小配置,能在vs2005中一鍵執行nunit。配置如下 tool選單不是可以新增外部工具嗎,就把nunit新增進去好了 接著做如下的配置即可,因為n...

微信iOS終端SDK開發新手教程

ios平台開發工具包 3.搭建開發環境 1 在xcode中建立你的工程。2 將sdk檔案中包含的 libwechatsdk.a wxapi.h wxapiobject.h 三個檔案新增到你所建的工程中 如下圖所示,建立了乙個名為test 的工程,並把以上三個檔案新增到test資料夾下 注 如果使用x...