10.29.2011

What iOS Simulator does not simulate: free()

在開發iOS app時一定要用實機測試,因為simulator跟實機的行為很多地方並不相同。Simulator除了不支援某些硬體功能外,在根本的運作機制上也有不同,這篇要分享的是在memory上的運作機制。

不過我也不打算寫太長,只寫要注意的地方就好了(因為太晚了~)。
我們先來看一段將Pixel array轉成UIImage的程式碼:

// 產生要畫的圖
unsigned char *pixels = malloc(nImageSize);
/*
 * (省略繪圖步驟)
 */
// 用畫好的圖產生image用的context
CGContextRef context = CGBitmapContextCreate(pixels, width, height, ...);

// 用完的記得要還,要養成好習慣!
free(pixels);

// 產生UIImage
CGImageRef imageRef = CGBitmapContextCreateImage(context);
UIImage image = [UIImage imageWithCGImage:imageRef]; 

// 要release才不會leak
CGContextRelease(context);
CGImageRelease(imageRef);

這段code在simulator能將pixels正確地轉成UIImage,使用Intruments也沒有發現memory leak,看起來沒問題吧!

很不幸地,在iPhone上完全不是這麼回事,你只會看到一片空白。

你看出問題在哪了嗎?是的,問題就在於pixels太早free了!應該要產生完image之後再free pixels。在iPhone上執行時,一呼叫free就會將memory清掉了,但simulator是在Mac OS上面執行,呼叫free時模擬的行為可能跟在iOS上面不一樣(可能是因為Mac OS X有GC的機制而iOS沒有)。如果只在simulator上面執行,就永遠找不到這個bug了!

所以如果你有在程式碼中呼叫free的話,記得在實機上也要測過喔!

P.S. 以後有機會再來分享在Android emulator中開發的心得。話說用i7-2600K來跑Android emulator還是很慢啊...

10.28.2011

追求細節

寫程式或是做產品跟畫漫畫其實有很多相似的地方,除了都是追求藝術外,也都講究細節。
這邊我所謂的細節不是指筆觸多精密,而是指漫畫中沒有留白的地方。

許多人看漫畫其實是在看“有圖的小說”,意思是說除了主要人物跟對白以外其實並沒有注意太多畫面上的細節(例如貼網點),而這些是使得畫面更加圓滿的必要元素;諷刺的是,當這些細節不存在時才會被人注意到似乎少了什麼東西,或是更直接一點就罵作者太混(我絕對不是在說富X)。

產品也是這麼回事,許多的小細節能使平凡的產品變得與眾不同,而堅持做出這些小細節的你也就變得與眾不同。

題外話:過度設計跟沒有細節一樣糟糕。