highlight.js

星期四, 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; 加回去, 只是多一道工, 而且對我來說, 變成還要額外解是為什麼要這樣做, 更是麻煩!

沒有留言: