頭と尻尾はくれてやる!

パソコンおやじのiPhoneアプリ・サイト作成・運営日記


Xcode 4.4でさよなら@synthesize

Xcode 4.4だと@synthesizeがいらなくなったってお話だよ。

Xcode 4.4にして試してみたかったのがプロパティを設定する時に必要な@synthesizeが不要になるって例のあれだよ。WWDCでも言ってたよね。
てっきりiOS 6でのお話かと思っていたのでこんなに早く使えるようになるとは驚いたよ。

さっそく試してみたんだけどさ、俺は古風な男なのでARCなんて生ぬるいシロモノは使わないのでそこのところ注意してね(ホントは勉強する気がないだけなんだ)。

まず従来の書き方だとこんな感じでやってたと思うんだ。
例えばPersonクラスのヘッダーファイル側に
@property(nonatomic, assign) NSInteger age;
@property(nonatomic, retain) NSString *name;
ってプロパティを設定するよね。

インスタンスの宣言はヘッダー側でも実装側でもいいみたいだけど、最近は実装側ファイルに書くようにしてるんだ。だってそっちの方が自然じゃない?外部のクラスからはどうでもいいインスタンスなんだからクラス内で処理しとけよって感じだし。
ってことでインスタンスの宣言を
NSInteger _age;
NSString *_name;
ってするでしょ。もっともこれは以前から不要だったんだよね、確か。俺は惰性で書いてたけどさ。

最後に実装ファイル側に
@synthesize age = _age;
@synthesize name = _name;
って書くよね。こうしておけばPersonクラス内で_ageでもself.ageでもアクセスできるし、外部クラスからだとperson.nameとかできるわけだよね。

で、今回のXcode 4.4だとこれが以下のようになるんだよ。
ヘッダー側にプロパティの宣言するんだ。
@property(nonatomic, assign) NSInteger age;
@property(nonatomic, retain) NSString *name;
これは同じ。ヘッダー側にこのクラスのプロパティを書く、そりゃそうだよね。さすがにこれは省けない。

すると実装ファイル側に@synthesizeナントカって書かなくても、プロパティとして扱ってくれてself.ageはもちろんPersonクラス内なら_ageでもアクセスできるんだよ!
ずいぶん楽、というかすっきりするよ、これ!

他の人はどうしてるのか知らないけど、俺はクラス内だと読み込むのにself.ageとは書かないで_ageって書いてるんだ。だってその方が短いし、かつプロパティってわかるだろ?だから_ageでアクセスできる、ってのも俺にとっては重要なんだよね。


そうそう、XcodeのEdit/Refactor/Convert to Modern Objective-C Syntaxで一度に書き換える、って機能があるんだけどこれが期待通りには動いてくれないんだ。以前すでに書いたソースに@synthesizeなんかがあれば消してくれる機能だと思うんだけどなぜか"No source changes necessary."って出ちゃうんだ。なんでかなあと思ってよくよく見ると、、、

Convert to Modern Objective-C Syntax

Minimum deployment target will be set to 10.6.8 for Mac OS X targets.
ってdeployment targetの指定がOS Xしか書いてないからiOSじゃだめなのか。

<< iOSで日本語OCRはやめておけ!  TopPage  Mountain LionにしたらPHPが動かない?! >>

コメント

助かりましたー

xcode&cocoaでhello worldする際、最初参考にしてたサイトが@synthesizeを使っていたので混乱していたところ助かりました。

2013.03.27   shota   編集

Re: 助かりましたー

> xcode&cocoaでhello worldする際、最初参考にしてたサイトが@synthesizeを使っていたので混乱していたところ助かりました。

どうもですー!

2013.03.28   たつや   編集

なるほどー

最近Objective-Cを始めたばかりで、@synthesizeが載っているサイトと載っていないサイトがあり混乱してました。@synthesizeは旧バージョンと聞いて納得。ありがとうございました。

2014.03.22   teru   編集

Re: なるほどー

> 最近Objective-Cを始めたばかりで、@synthesizeが載っているサイトと載っていないサイトがあり混乱してました。@synthesizeは旧バージョンと聞いて納得。ありがとうございました。

コメントありがとうございます。

2014.03.24   たつや   編集


管理者にだけ表示を許可する
 

トラックバック

トラックバックURL
http://ringsbell.blog117.fc2.com/tb.php/639-defaa39f




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.

FC2Ad