« 2011年3月 | トップページ

2011年4月

2011年4月15日 (金)

XCode4というかObjective-Cのプロパティー宣言

今日、いつものようにxcode4を立ち上げ新規にView-basedApplicationを選択。
なにげなーく、AppDelegate.hを見てみると、、、

@class TestViewController;

@interface TestAppDelegate : NSObject  {
}

@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet TestViewController *viewController;

@end
ん、ええー、おい!プロパティー宣言があるのに実際に変数の宣言がない!
じゃ、どこに宣言されているんだと探してみても見当たらない。

で、もしかしてと思い試しに下のようにしてみました。

@class TestViewController;

@interface TestAppDelegate : NSObject  {
}

@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet TestViewController *viewController;
@property (nonatomic, retain) NSString *testString;

@end

@implementation TestAppDelegate

@synthesize window=_window;
@synthesize viewController=_viewController;
@synthesize testString=_testString;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
     
    self.testString = @"test";
    NSLog(@"self.testString:[%@] _testString:[%@]", self.testString, _testString);
	
    self.window.rootViewController = self.viewController;
    [self.window makeKeyAndVisible];
    return YES;
}

// 以下省略
恐る恐るビルドしてみると、、、
コンソールには、、、

self.testString:[test] _testString:[test]

なんと無事に動きました。
これはもう暗黙的に宣言されているとしか思えません。
そこで、アップルのドキュメントをあさる事15分、、、
こんな記述を見つけました。

「Objective-Cプログラミング言語」より

従来のランタイムで@synthesizeが機能するためには、同じ名前を持ち、そのプロパティと互換性 のある型を持つインスタンス変数を用意するか、@synthesize文で既存の別のインスタンス変数を 指定する必要があります。
最新のランタイムでは、インスタンス変数がない場合は、コンパイラが それを追加します。
たとえば、次のようなクラス宣言と実装があるとします。
従来のランタイム用のコンパイラでは、@synthesize noDeclaredIvar;の箇所でエラーが発生し ます。
最新のランタイム用のコンパイラでは、noDeclaredIvarを表すインスタンス変数が追加さ れます。

@interface MyClass :NSObject {
 float sameName;
 float otherName;
}
@property float sameName;
@property float differentName;
@property float noDeclaredIvar;
@end

@implementation MyClass 
@synthesize sameName; 
@synthesize differentName=otherName; 
@synthesize noDeclaredIvar; 
@end
はい、初めて知りました(汗)

  あれー、今までもこうだったかなと思いXCode3で作ったプロジェクトを見ましたが そちらにはちゃんと変数の宣言がありました。
どーもXCode4で変わったようです。

変数の宣言をしないのはラクチンなのですが、なんか気持ち悪いので
私はあえて宣言するようにします。

« 2011年3月 | トップページ

無料ブログはココログ

最近のコメント

2018年10月
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      

最近のトラックバック