highlight.js

顯示具有 Apple 標籤的文章。 顯示所有文章
顯示具有 Apple 標籤的文章。 顯示所有文章

星期五, 10月 12, 2012

IBOutlet 與 IBAction 到底是什麼?

在學習 iOS 開發的時候, 一定會遇到的就是 IBOutlet 與 IBAction, 這兩個其實是定義在 UIKit 的 UINibDeclarations.h 中的 macro, 定義如下:
#ifndef IBOutlet
#define IBOutlet
#endif 
#ifndef IBAction
#define IBAction void
#endif
從定義可以看出來, IBOutlet 與 IBAction 對於程式碼沒有實質的意義, 存在的作用只是像是標籤一樣, 標示了程式碼中的某個屬性可以用來對應到介面上的某個同樣類別的元件, 或是某個方法可以用來回應規格相符的事件。

星期四, 10月 11, 2012

Xcode 4.5 自動產生 IBOutlet 屬性的改變

前天想說編輯的書最後還是應該用 Xcode 4.5 校稿才對, 結果一升級之後今天測試了一下, 發現了一個討厭的問題, 就是在自動產生 IBOutlet 的屬性時, 在對應的成員變數的命名上不一樣了, 這樣一來, 不就得要改書中的內文以及程式了?

以前如果在 Interface Builder 上從一個 UILabel 產生 IBOutlet 屬性, 假設取名為 myLabel, Xcode 會在 ViewController.h 檔中產生以下這行 @property 指令:
@property (weak, nonatomic) IBOutlet UILabel *myLabel;
同時在 ViewController.m 檔中產生對應的 @synthesize 指令:
@synthesize myLabel;
這樣在 ViewController.m 中就可以直接以 myLabel 操作對應的元件。但是在 Xcode 4.5 中, 已經不會產生 @synthesize 指令, 這會導致編譯時由編譯器自動以如下的 @synthesize 敘述幫你合成 getter 與 setter 方法:
@synthesize myLabel = _myLabel;
也就是將對應的成員變數以你指定的屬性名稱加上 "_" 為字首命名, 使得屬性名稱與對應的成員變數名稱變成不一樣了, 因此無法以 myLabel 操作元件, 而必須加上 self  以 self.myLabel 才能操作對應的元件。當然, 也可以直接使用變數, 但這樣除了違背封裝的意圖, 也會使用到程式中沒有出現過得變數。這下子, 書中原本的程式以及解說的內容都得一併修改, 真是麻煩了。

當然, 這樣的變更主要是為了符合良好的程式撰寫習慣, 讓屬性與成員變數能夠明確地區分開來, 不過能不能有個選項讓我可以選擇要不要接受這樣的改變啊?

PS:如果需要, 還是可以自行把 @synthesize myLabel; 加回去, 只是多一道工, 而且對我來說, 變成還要額外解是為什麼要這樣做, 更是麻煩!

星期一, 10月 08, 2012

關掉 Mac 開機的『登』聲音

不知道有沒有人跟我一樣覺得很困擾, 不想要再 Mac 開機時聽到一聲『登』, 尤其是在特定的場合, 『登』一聲實在很尷尬。網路上查了一下, 最簡單的方法就是裝個小工具, 設定開機時不啟用音效, 或是靜音, 我自己試過在 10.7.4 上使用 StartNinja, 可以完美達成任務, 其他有些軟體可能因為 Mac OS 版本的關係, 無法成功。

除了安裝工具軟體外, 也可以參考這一篇問答中 Acid 的回覆, 使用 AppleScript 加上開機與關機的 script, 在關機時設定喇叭靜音, 並在開機完成後設定喇叭恢復原始音量, 這樣就可以在開機時不會聽到『登』的聲音, 但開機後一樣可以聽到正常的聲音了。

星期六, 10月 06, 2012

Objective-C 的協定 (Protocol)

前幾天在看 iOS 開發的翻譯書稿件, 注意到一件奇怪的事。在使用 UIAlertView 的時候, 有些書都沒有強調擔任 UIAlertView 的委派物件必須遵守 (conform) UIAlertViewDelegate 協定。因此, 如果是由 controller 擔負委派物件時, controller 的類別大概會是這樣:
@interface ViewController : UIViewController
    ....
- (void)alertView:(UIAlertView *)alertView
    clickedButtonAtIndex:(NSInteger)buttonIndex {
    .....
}
@end
事實證明, 這樣的確是可以運作, 連個編譯的錯誤訊息都沒有。當使用者點選了 UIAlertView 上的按鈕時, 的確會引發 clickedButtonAtIndex。

但若是使用 UIActionSheet 時, 書中卻又強調委派物件必須遵守 UIActionSheetDelegate 協定。因此, 如果一樣由 controller 擔任委派物件時, controller 類別大概會長這樣:
@interface ViewController :
        UIViewController<UIActionSheetDelegate>
.....
- (void)actionSheet:(UIActionSheet *)actionSheet
        clickedButtonAtIndex:(NSInteger)buttonIndex {
.....
}
@end
實在覺得很奇怪, 兩個元件的 pattern 其實是一樣的, 但為甚麼一個需要明確標示遵守協定, 另一個卻不用?經過 google 找到這一篇 Why do I not need to declare UIAlertViewDelegate in the header?, 看起來原因有兩個:
  1. 在建立 UIAlertView 的  initXXX 方法中, delegate: 的型態是 delegate:(id), 並沒有要求委派物件必須遵守任何協定。但是在建立 UIActionSheet 的 initXXX 方法中, delegate: 的型態卻是 delegate:(id < UIActionSheetDelegate >), 表示委派物件應該要遵守 UIActionSheetDelegate 協定。
  2. 在 Objective-C 中, 協定的角色似乎沒有其他種類物件導向語言中的界面 (Interface) 那樣嚴謹。事實上, 如果擔任 UIActionSheet 的委派物件並沒有遵守 UIActionSheetDelegate 協定,  只要實作有正確的 clickedButtonAtIndex: 方法, 程式一樣可以動, 只是編譯時會有警告訊息而已。而在 framework 的實作中, 看來也都是以透過 respondsToSelector:@selector(delegatedMethod:) 檢查委派物件是否具有指定的方法, 才會實際叫用該方法, 而不是依靠是否遵循特定的協定來判斷。
換句話說, 協定就只是給大家參考的規格書, 而不是像是其他語言中的界面那樣嚴格。 

星期二, 10月 05, 2010

解說數學極限觀念的精彩範例

前一陣子在翻閱《世にも美味しい数学》(美味的數學)這本書時,看到了一個對於數學中極限觀念的精彩範例,題目是這樣的:如果要切蛋糕給三個人吃,怎樣切才能讓三個人吃到相等份量的蛋糕呢?如果是要切出四等分、八等分,一般人都可勝任,但是三等分要怎麼切呢?

只要套用極限的觀念,就可以找到「理論」上的切法了。先將蛋糕切成四等分,每人分1/4,再將剩下的1/4切成四等分,每人拿一份,也就是原本蛋糕的1/16,再將剩下的一份切成四等分,如此循環,也就是每個人實際上拿到整個蛋糕的1/4 + (1/4)^2 + (1/4)^3 + ...... + (1/4)^x,當 x 趨近無限大時,每個人所分到的就是趨近 1/3,不過這當然是「理論」上的切法啦,x = 4以上時,大概就很難再切下去了吧?除非原本就是個超級大蛋糕!

題外話,針對這個問題,如果你有 iPhone 的話,有現成的 app CakeCutter 讓你打開相機對著蛋糕,就會自動出現任意等分的分割線,只要照著分割現切蛋糕就好了,哈哈!

星期四, 1月 11, 2007

Here Comes iPhone, Cool.

透過線上觀看Steve Jobs簡報已經是我近年來的大樂趣,昨天看的iPhone秀更是讓我悸動不已,我記得上一次讓我有這種感覺的產品是Google的GMail。整個秀(雖然該說是簡報,但實在像是一場秀)高潮不斷,讓我讚嘆的有以下這些:
  • iPod部份
    • 手指捲動清單的方式,這的確很類似我們用手指指著一串資料閱讀的手法。
    • 翻弄唱片封套找唱片,相當符合一般人找CD的習慣,我想到的是現在的電子書閱讀器不知道能不能用這樣的方式作翻頁的效果,會更像是在翻書。
  • Phone部份
    • 加入類似GMail Conversation的SMS(簡訊)處理方式,的確很適合現在大量用簡訊的手機用戶,這項功能也是我個人覺得GMail最值得稱道的地方。
    • 直接讀取特定的留言,不知道這是否需要系統商支援?如果並不需要,而只是現今的手機都沒做到,那真是奇怪了。
  • Photo Album部份
    • 用多觸點的觸控螢幕控制圖形縮放,真有一套,我想這應該會有更多用途,雖然目前只看到這個用法。
  • Internet Navigator
    • 有Safari Browser真好,最棒的是先以縮圖方式顯示完整的網頁,可自由選取區域放大閱讀點擊,而不會因為畫面實體的大小破壞網頁的外觀(像是瀏覽器中有虛擬桌面)。另外,透過Web Page Thumbnail選取頁面也可以解決tab太多無法分辨個別頁面的困境。我一直都希望可以有一個PDA大小的PC,只要能跑Firefox,加上Google的各式服務就是一個超讚的PDA,還不需要同步來同步去的哩。
隨便先記下這些,2008年亞洲才上市,好樣的,真會做生意!

對了,改天應該來談談Steve Jobs的簡報術。

延伸閱讀: