整理了一個多月開發中的一些小問題,當然,本身遇到問題肯定還有更多,
比如類別的一些使用的技巧,協議格式的一些特殊字元,
同步於非同步網路處理的選擇,資料的儲存選擇,類的設計。
因為其實大部分ios互連網應用的技術含量不會是很深奧,基本到後來發現就是對UI控制項的一些需熟能生巧的應用,網路編程以及邏輯的處理,
更多的還有是一些經驗和積累。
這邊是幾個早期的問題,也就是一個開發開始一個禮拜中一些問題我還做記載,後面一個月進度匆忙,也就懶於記錄
1.UILabel中顯示多行時,自動換行。
label.numberOfLines =0; label.lineBreakMode = UILineBreakModeWordWrap;
前提是該label設定的frame是足夠大的。不支援滾動。
理論上不支援這麼做,因為TextView控制項相對來說更好
2.nil和release區別
nil和release的作用:
nil就是把一個對象的指標置為空白,只是切斷了指標與記憶體中對象的聯絡;
而release才是真正通知記憶體釋放這個對象。
所以nil並沒有釋放記憶體,只有release才回真正釋放記憶體。
再分析一下二者使用的先後順序:
如果沒有release就直接nil,那麼雖然不會出錯,卻等於自己製造記憶體流失了,因為nil之後release就已經不起作用了。
相反,如果在使用介面對象時只僅僅release沒有設定self.myOutlet =
nil,那麼程式可能也不會報錯,但卻會十分不穩定、不健壯,很容易發生崩潰現象。
因為一個介面對象在release之後,給它所分配等記憶體就已經被釋放了,如果釋放之後系統再用到這個對象,那麼程式就會crash。
如果釋放之後把它的指標置為空白,則即便後面的程式用到該對象,也不會崩潰。
3.擷取目前時間和格式化
NSString *postTime; NSDateFormatter *formatter = [[NSDateFormatteralloc] init]; [formatter setDateFormat:@"YYYYMMddhhmmss"]; postTime = [formatter stringFromDate:[NSDatedate]];
4.巧妙的運用宏,高效的預先處理
5.關於版本控制工具Versions:Versions上FileMerger找不到路徑的報錯問題。
應用會提醒建議重裝,說沒有安裝這個工具,但是在Xcode下我們又是能發現該應用已經裝了的。
最後網上查了下說是Xcode版本升級問題,導致應用路徑該了,當時versions預設對filemerge路徑沒改。
剛剛把 Xcode 升級到 4.3.2 發現 Versions 的檔案對比功能無法使用了。因為 Xcode 自從 4.3 之後整體打包成一個App放到了 /Applications 下面,過去的 /Developer 整個被建議刪除掉了。
Versions 按照原來的路徑沒辦法找到 FileMerge.app 所以搞罷工。處理起來很簡單,去命令列執行
sudo /usr/bin/xcode-select -switch /Applications/Xcode.app/Contents/Developer
6.項目編譯時間一種常見格式報錯
Undefined symbols for architecture i386:
"_OBJC_CLASS_$_ASIHTTPRequest", referenced from:
objc-class-ref in ASIInputStream.o
_OBJC_CLASS_$_ASIFormDataRequest in ASIFormDataRequest.o
objc-class-ref in ASIFormDataRequest.o
objc-class-ref in ASINetworkQueue.o
objc-class-ref in ASIDownloadCache.o
objc-class-ref in NLNetHelper.o
"_OBJC_METACLASS_$_ASIHTTPRequest", referenced from:
_OBJC_METACLASS_$_ASIFormDataRequest in ASIFormDataRequest.o
"_NetworkRequestErrorDomain", referenced from:
-[ASIFormDataRequest addFile:withFileName:andContentType:forKey:] in
這是我們在引入第三方類庫檔案時,build後錯誤。比如引入_ASIHTTPRequest和SBJson時。
如果出現以上錯誤了,比較簡單的方法就是。點擊項目,--》build Phase s--》compile sources中,點擊add後,我們能看到項目下的源檔案,此時,建議把你能看到尾碼為.m檔案全add了~~。
後來發現同事引入時沒沒什麼問題,經提醒發現一個一直被我忽略的問題,就是拖動檔案進來時,一般我們是選了非引入而是copy一份,這個沒問題,但是下面海域個選礦,addtarget。這個記得勾上,因為關係到項目的一些配置,我估計是就是這個原因。
7.ios用戶端於java服務端互動關於null的的問題
在ios網路操作時解析json時,有時會有這樣額一種情況: “myThing”:null;
而myThing根據情況分成:1,在有返回的時候是一個字典;2若無內容,返回null。
然後我們在用戶端處理是需要判斷是佛為null才能來做相應的解析(如果null依舊去解析這個自定則會報錯),但是僅僅的一句 if(dic)並不試用。
必須[Dic isEqual: [NSNull null]]
這個其實是指標空於內容空的一種區別。一般來說我們在判斷指標空是用nil,而內容空則是NSNull
8.判斷字竄A中是否包含字竄B
暫時沒找到java中的包含函數
oc提供了一個rangeOfString。然後看length長度。
9.關於ViewController之間互動,資料的傳遞
在Android我們知道兩個Activity之間可以使用bundle來傳遞,iOS中其實提供了很多解決方案.
但是後來發現最簡單的一種就是,我們在第二個ViewController中申明一個這樣的屬性,
在第第一個ViewController中初始化第二個vc後,設定進去要傳遞的資料就可以了~
當然,用一個全域或是單例類存放在某些情況下會很合適。
10.NSNotificationCenter的妙用和小技巧
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(refeshLogin) name:@"login" object:nil];
訊息的註冊和監聽,以及發送通知調用post發送然後監聽處理。
我覺得善用這個類很美妙。