2013/07/31

[廣告] Objective-C 無痛入門(Objective-C Fundamentals)

嗨,我翻譯了一本書,在這裡打打廣告。

書名:Objective-C 無痛入門
原書名:Objective-C Fundamentals
作者:Christopher K. Fairbairn、Johannes Fahrenkrug、Collin Ruffenach
譯者:我
出版社:博碩
出版日期:2013年7月30日
頁數:416



這是Objective-C程式語言的入門書。

目錄

Part 1 起手撰寫Objective-C 程式
  Chapter 01 初次建立iOS 應用軟體
  Chapter 02 資料型別、變數與常數
  Chapter 03 第一次接觸物件
  Chapter 04 資料儲存與群集物件

Part 2 建立你自己的物件
  Chapter 05 建立類別
  Chapter 06 擴充類別
  Chapter 07 協定
  Chapter 08 動態型別檢查與執行時期型別資訊
  Chapter 09 記憶體管理

Part 3 充分利用軟體開發框架
  Chapter 10 錯誤與例外處理機制
  Chapter 11 鍵值編碼與NSPredicate
  Chapter 12 讀寫程式資料
  Chapter 13 Block 與Grand Central Dispatch
  Chapter 14 除錯技巧

2013/07/29

讀後想法:電影的魔力

書名:電影的魔力:Howard Suber電影關鍵詞
原書名:The Power of Film
作者:Howard Suber
譯者:游宜樺
出版社:早安財經

電影相當複雜,結合了各種形式的藝術元素,攝影機角度與移動、燈光、編輯、特效、故事情結、人物塑造、對話、場景切換、音樂、等等,那麼,怎樣算是好電影呢?好電影又一定會賣座嗎?賣座電影在多年後仍會長存於記憶之中嗎?

作者擁有超過40年的教學經驗,在UCLA電影學院與一批又一批的編劇、導演、製作相互對談與激盪,結合了經驗與上課筆記後,將整門的總結或特定主題精鍊,便成為本書的一個小單元,書中含有約300個單位,每單元一到三頁,依照英文字母順序排列,讀者可隨心情跳著看,或是在有需要時查詢。

書中所敘述的觀察與原理,並不適用全部的電影,所舉例證也都是美國的經典賣座電影,作者特別說明挑選準則為能夠受歡迎且持續10年以上的電影,諸如教父、北非諜影、亂世佳人、阿瑪迪斯、美國風情畫、桂河大橋、唐人街、大國民、畢業生、大白鯊、阿拉伯的勞倫斯、北西北、飛躍杜鵑窩、驚魂記、法櫃奇兵、辛德勒的名單、沉默的羔羊、星際大戰、2001:太空漫遊、綠野仙蹤、等等,若能看過這些電影,自然能對書中所述更有體會,但即使沒有,也能根據自己看過的電影戲劇來印證(或挑戰)作者的看法。

因為所舉的電影例證都是美國好萊塢電影,或許你會不贊成書中的某些觀點與結論,但這不是更好嗎,一方面可以好好觀看作者如何分析美國經典賣座電影,研究其中的裡裡外外,另一方面也可以想想與別的國家與別的文化有何不同,為何一部電影在不同地方的評價相差甚大,為何某些電影有能在全世界大賣特賣引發風潮。

書中每個小單元都可以獨立出來,可以將書本放在桌上,有空時便翻閱一下,翻翻感興趣的單元,譬如原著與改編電影之間的差異,故事中的英雄、邪惡力量、社群社會之間的關係,如何避免乏味與創造笑聲,喜劇與悲劇的著眼點,勇氣、執著、恐懼、幻想、忠誠、使命、誤導、知識、正義、直覺、怪物、矛盾、等等族繁不及備載,看電影除了看到我們想看的東西之外,閱讀此書後,將能看到更多的細節與巧思,看到更多的象徵意義與隱喻,甚至看到人與自己。

在享受現代電影聲光刺激與電腦特效的同時,我們也可以透過此書一窺其內涵與其中的藝術成分。

2013/07/06

[廣告] 10 天就懂!一定學會 iPhone 程式開發的 40 堂關鍵課程

嗨,我審校了一本書,在這裡打打廣告。

書名:10 天就懂!一定學會 iPhone 程式開發的 40 堂關鍵課程
原書名:10日でおぼえるiPhoneアプリ開発入門教室
作者:関根 元和
譯者:廖文斌
審校:我
出版社:博碩
出版日期:2013年7月1日
頁數:448



這是一本iPhone軟體開發的入門書,屬於初心等級的著作,分成10章每章一個App主題,以製作樂趣為宗旨,包括多功能時鐘應用程式、樂器應用程式、地圖應用程式、相簿應用程式、等等,細分為40個LESSON,含有實際操作與理論課程,章末也會複習該記得的重點。

目錄如下:

Chapter 01 Hello World!:製作應用程式的基礎知識
LESSON01 製作什麼事都不做的應用程式
LESSON02 操作按鈕在畫面上顯示文字
LESSON03 使用各種UI 零件
LESSON04 用動畫顯示圖片

Chapter 02 製作Web 瀏覽器
LESSON05 顯示網站
LESSON06 加上頁面導覽
LESSON07 讓應用程式可以輸入URL
LESSON08 支援畫面旋轉功能

Chapter 03 製作多功能時鐘
LESSON09 使用分頁列
LESSON10 製作時鐘
LESSON11 製作計時器
LESSON12 製作碼錶

Chapter 04 製作復古相機應用程式
LESSON13 製作Action Sheet
LESSON14 拍下照片並加以選擇
LESSON15 顯示照片
LESSON16 圖片處理與儲存照片

Chapter 05 製作地圖應用程式
LESSON17 顯示地圖
LESSON18 更新當前位置
LESSON19 顯示目前的地址

Chapter 06 製作圖片檢視器應用程式
LESSON20 只顯示一張圖片
LESSON21 顯示多張圖片
LESSON22 讓圖片可以放大和縮小
LESSON23 省下無謂消耗的記憶體

Chapter 07 製作樂器應用程式
LESSON24 使用加速度感測器
LESSON25 在實機上進行除錯
LESSON26 播放音訊
LESSON27 在靜音模式下發出聲音

Chapter 08 製作Twitter 應用程式
LESSON28 取得網際網路上的資訊
LESSON29 使用Twitter 的API
LESSON30 解析取得的JSON 資料
LESSON31 顯示Tweet 列表

Chapter 09 製作音樂資料庫應用程式
LESSON32 使用CoreData
LESSON33 考慮資料結構
LESSON34 追加資料
LESSON35 編輯資料
LESSON36 排序資料

Chapter 10 歡迎來到App Store!
LESSON37 將應用程式本地化
LESSON38 在做好的應用程式中內嵌iAd
LESSON39 製作應用程式圖示
LESSON40 在App Store上發布應用程式


2013/07/05

Apple WWDC 2013中關於Objective-C的新東西

WWDC 2013落幕多時,影片可到此下載

我看了402 What’s New in the LLVM Compiler、404 Advances in Objective-C、408 Optimize Your Code Using LLVM後,將重點簡述於下。

Objective-C語言居然登上TIOBE第三名,真是太厲害了。

新功能Module,在原本的Framework再包裝一層,使用起來更方便,更接近近代語言中「匯入模組」的形式;@import某標頭檔後,Xcode也會自動連結相對應的Framework,不需要自己到Link Binary With Libraries手動加入。目前,只有系統Framework可成為Module。

C相關語言的前置處理器(preprocessor)相當古老,使用文本置換的機制,大大拉長編譯時間,也不利於模組化,只不過積習難改,通常會透過預先編譯標頭檔的機制加以緩解。Module算是往前邁進一步,不錯。

新關鍵字instancetype,類別的-init方法原本是回傳id,但id可轉型為任何型別,造成困擾,將回傳型別換成instancetype後,就能編譯器處理,換成正確的型別。


除此之外,編譯器的部份也有不少增進的地方,錯誤與警告訊息更好更多了,能夠抓出更多錯誤。

Apple已經明確表示揚棄Garbage Collection了,全面採用ARC,Xcode 5也改用ARC。編譯器裡處理ARC的部份也更聰明了,現在可以看懂Core Foundation的命名慣例,當我們自動橋接,我們不需要自己加入__bridge了。

編譯器開始支援Apple的A6處理器(iPhone 5與新iPad),架構名為armv7s。處理器裡面其實有特別為向量打造的硬體加速能力,譬如Intel AVX(Advanced Vector eXtensions),Xcode 5開始支援AVX2。LLVM 5.0可分析strict aliasing(關鍵字strict)、支援LTO(Link-Time Optimization),在連結期間對整支程式進行最佳化,而不是分別針對每一支原始碼檔案最佳化。將迴圈向量化。Xcode 5不再支援GCC與LLVM-GCC。對C++11的支援也越來越好。另外還有許多最佳化參數,需視情況開啟或關閉,注意,有些最佳化參數,譬如關於浮點運算,可能會產生不一樣的結果。

2013/07/04

Objective-C迭代陣列

當手上有一堆東西時,常常就會需要作「迭代(enumeration)」的動作,譬如找出其中某些符合條件的東西、對全部東西執行某個動作、等等。

在Objective-C裡,經過時間演進後,有非常多方式可以進行迭代,底下一一描述。

NSArray *array = ...; //假設這是含有一堆字串的陣列

以迴圈手動撰寫,印出陣列裡每一個字串:
for(int i = 0, n = [array count]; i < n; i++){
    NSLog(@"%@", [array objectAtIndex:i]);
}

也可以用NSEnumerator:
NSEnumerator *enumerator = [array objectEnumerator];
NSString *s;
while(s = [enumerator nextObject]){
    NSLog(@"%@", s);
}

不過NSEnumerator已經被Objective-C 2.0新功能Fast Enumeration(for/in語法)取代了:
for(NSString *s in array){
    NSLog(@"%@", s);
}

不僅如此,自從iOS 4之後,還加入了block與新的API(非常多):
[array enumerateObjectsUsingBlock:^void(id obj, NSUInteger idx, BOOL *stop){
    NSLog(@"%@", obj);
}];

照理說,執行效能應該是後面的比前面快,不過我有時候測試一些特殊情況時,並不一定如此。不管如何,block是新機制,Apple也加入不少以block為基礎的API,應該是第一首選才是。

另外,NSDictionary與NSSet也會有差不多的東西,不贅述。

雖然是殺雞用牛刀,底下試試以GCD與Block來迭代陣列。

dispatch_queue_t q = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

dispatch_apply([array count], q, ^(size_t i){
    NSLog(@"%@", array[i]);
});

不過使用的是concurrent queue,NSLog不一定會是從陣列索引值0依序輸出。可自行建立serial queue,便能得到想要的結果。


參考資料: