For investors
股價:
5.36 美元 %For investors
股價:
5.36 美元 %認真做教育 專心促就業(yè)
基礎(chǔ)篇
為什么對一個變量release后還要設(shè)為nil
對一個變量release后,這個變量指向的內(nèi)存釋放了,但這個變量本身沒變,仍指向原來的內(nèi)存地址。若這個變量在釋放后被訪問,或者被重復(fù)release,就會導(dǎo)致應(yīng)用崩潰。設(shè)為nil后這個變量指向0×00,可以保證程序以后訪問不到原先的內(nèi)存地址,對nil進行release也沒任何問題。
使用類成員時,前面加不加self.有什么區(qū)別
不加self.調(diào)用的是成員本身,加self.后實際上調(diào)用了其成員的get set方法。
例:
//.h
@property (nonatomic, retain) NSString *name
//.m
name = @"bang" //沒有retain,隨時會被釋放
NSString *str = self.name //等于NSString *str = [self name];
self.name = @"bang" //等于[self setName:@"bang"]; 這時在set方法里retain了這個字符串
技巧篇
內(nèi)存泄漏
可以通過xcode的編譯工具Product-Analyze檢查函數(shù)塊范圍內(nèi)可能的泄漏點(外帶會提示一些可能有的錯誤)。
用leaks工具監(jiān)測出來的泄漏查找方法是跟蹤其代碼提示中出現(xiàn)的變量,經(jīng)常這個變量是在提示的調(diào)用堆棧以外的地方泄漏的。若實在查不到,最終辦法是重寫這個變量的retain和release方法,debug,從調(diào)用堆棧看是誰retain了它而沒有release。
要注意的是,用CFXXCreate(例如CFArrayCreate)生成的變量要用CFRelease釋放。
數(shù)據(jù)存儲
如無搜索需要,可以將一個數(shù)據(jù)對象直接序列化后存到sqlite,取出時直接反序列化為對象使用。序列化需要數(shù)據(jù)類實現(xiàn)NSCoding協(xié)議,實現(xiàn)encodeWithCoder和initWithCoder兩個方法就行,若有多個數(shù)據(jù)對象,可以寫個基類實現(xiàn)這兩個方法,并在這里面利用反射枚舉自身所有變量去encode和decode,一勞永逸,具體實現(xiàn)網(wǎng)上找找就有了。
組件篇
UINavigationController頭尾顯示隱藏
在用NavigationController去管理view的push和pop時,需要根據(jù)不同的view設(shè)置是否顯示NavigationBar和ToolBar,一開始在錯誤的地方設(shè)置了,導(dǎo)致有時該顯示NavigationBar和ToolBar時不顯示的情況,后來發(fā)現(xiàn)在viewWillAppear上設(shè)置萬無一失。別笑我土鱉,沒好好去理解它整個流程,一直沒發(fā)現(xiàn)。
- (void) viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
[self.navigationController setToolbarHidden:NO];
[self.navigationController setNavigationBarHidden:NO];
}
UITableView游標式渲染
tableView的機制大概是:先定好總行數(shù),某一行滾入視圖范圍時,回調(diào)一個函數(shù)去取view出來顯示。這一行滾出視圖再滾入時仍會繼續(xù)回調(diào)這一函數(shù)取view。有這樣的機制就是說無論你table里的數(shù)據(jù)有多少,都可以全部放入table中不用分頁,因為不用一次性把所有數(shù)據(jù)都取出來,只在需要顯示的時候根據(jù)游標去取對應(yīng)的數(shù)據(jù)就行了。
可能這是APP組件很自然的方式不用說明,但在web上頁面上的數(shù)據(jù)和元素都是要一次性載入內(nèi)存的,做久了web,一開始沒想到它這樣的實現(xiàn)機制,導(dǎo)致我們走了不少彎路。
UIWebView渲染范圍
UIWebView不是根據(jù)可視范圍決定每次的渲染范圍,而是根據(jù)自身控件的frame大小決定。
曾嘗試webview嵌在tableview里,為了讓webview跟tableview一起滾動,把webview的大小設(shè)為webview里的內(nèi)容大小,讓webview不出滾動條,從而能跟著tableview的滾動條一起滾。這樣做的后果是每次webview都一次性渲染整個頁面,內(nèi)存占用多性能很差,而且在放大縮小這個webview時,渲染放大的整個頁面更吃力,出現(xiàn)不能忍受的性能。解決辦法是讓webview定住高度為一整屏iphone的高度,限制了webview每次的渲染范圍為可視范圍,性能大好。帶來的問題是無法隨tableview滾動,但可以以其他方式優(yōu)化體驗。最近看到新版的ZAKER也是這樣做的。
個人感覺篇
界面布局調(diào)整非常麻煩,讓人懷念web了。界面描述方法XIB感覺晦澀難學(xué),至今不會,沒有CSS+HTML來得方便。
有編譯器把關(guān),少了像寫js時多寫or寫錯一個字符查半天的問題。
Object-C寫起來各種變量函數(shù)和變量調(diào)用很長,沒有js的短小精悍來得爽。
第一次編寫涉及手動內(nèi)存管理的程序,挺有意思,沒想象中難,但有些內(nèi)存管理導(dǎo)致的bug很難查。
雖然APP不像web那樣隨時更新,但也不像傳統(tǒng)PC客戶端升級那么麻煩,用戶更新意愿更強,還是適合快速迭代的。
細節(jié)是可以決定成敗,但得看你把什么定成細節(jié)。
最后,0 bug的程序不存在,極致是把最主要的事做好。done is better than perfect。
【免責聲明】本文部分系轉(zhuǎn)載,轉(zhuǎn)載目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點和對其真實性負責。如涉及作品內(nèi)容、版權(quán)和其它問題,請在30日內(nèi)與聯(lián)系我們,我們會予以更改或刪除相關(guān)文章,以保證您的權(quán)益!