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月16日 (水)

xcode4 をインストールしたらしておくべき設定

xcode4 にバージョンアップして数日、使い勝手が大きく変わりメニューが英語になってしまいかなり戸惑っていましたが、慣れてくると xcode3 より使いやすいような気がしてきました。

そこで、少しだけですがインストール直後に最初に変更した設定を紹介します。

1.Tab 表示
20110316_200459

2.行番号・ページガイドライン表示
20110316_200508

個人的に Tab 表示できるようになってかなり効率が変わった気がします。
MacBook 13 inch なので Window がぽこぽこでると何をしているのか分からなくなるので(^^;
でもやっぱり iMac か 大きなディスプレイが欲しいです。。。


iPhone SDK アプリケーション開発ガイドiPhone SDK アプリケーション開発ガイド


著者:Jonathan Zdziarski

販売元:オライリージャパン
Amazon.co.jpで詳細を確認する

詳解 Objective-C 2.0 改訂版Book詳解 Objective-C 2.0 改訂版

著者:荻原 剛志
販売元:ソフトバンククリエイティブ
Amazon.co.jpで詳細を確認する


2011年3月15日 (火)

TabNaviApplication

xcode3 から xcode4 にアップデートして Tab Bar と Navigation を組み合わせたアプリの作り方に少し戸惑ったのでメモ。

Tab Bar Application を選択します。 Tabnavi1

プロジェクト名を設定して次へ。 Tabnavi3

MainWindow.xib を選択。Window が表示されます。 Tabnavi2

画面左下の再生マークの逆向きのようなアイコン「◀」をクリック Tabnavi4

右上にある View の一番左をクリックし、インスペクタを表示させます。 Tabnavi5

インスペクタから Navigation Controller を First View の前にドラッグして追加。 Tabnavi6

中央の Objects にある View Controller の上に TableViewController をドラッグ。 Tabnavi8 Tabnavi82

プロジェクトのルートフォルダを右クリック「New File」を選択して表示されるウィンドウから 「UIViewController subclass」 を選択し、次へ。 20110316_122211

Subclass of を 「UITableViewController」を選択し、 「With XIB for user interface」がチェックされている場合はチェックを外して次へ。 20110316_122315

名前を適当につけて保存すると、プロジェクトにファイルを追加されます。 20110316_122315_2 20110316_125711

MyTableViewController.h を以下のように編集します。

#import <UIKit/UIKit.h>

@interface MyTableViewController : UITableViewController {
    NSMutableArray *data;
}

@end

MyTableViewController.m を以下のように編集します。(変更箇所以外は省略)

- (void)dealloc
{
    [data release];        // tableView 用データ解放
    [super dealloc];
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Uncomment the following line to preserve selection between presentations.
    // self.clearsSelectionOnViewWillAppear = NO;

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
    // self.navigationItem.rightBarButtonItem = self.editButtonItem;

    // tableView 用データ
    data = [[NSMutableArray alloc] init];

    // tableView 用データの追加
    [data addObject:@"1行目"];
    [data addObject:@"2行目"];
    [data addObject:@"3行目"];
    [data addObject:@"4行目"];
    [data addObject:@"5行目"];

    // tableView 再描画
    [self.tableView reloadData];

}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
// #warning Potentially incomplete method implementation.
    // Return the number of sections.
    return 1;    // セクション数, 今回はセクションを作らないので 1 固定
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
// #warning Incomplete method implementation.
    // Return the number of rows in the section.
    return [data count];    // tableView の行数
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // static NSString *CellIdentifier = @"Cell";
    int row = [indexPath row];    // 表示を行おうとしている行番号
    NSString *CellIdentifier = [data objectAtIndex:row];    // 行番号からデータを取得

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
        cell.textLabel.text = CellIdentifier;    // データをセルに設定
    }

    // Configure the cell...

    return cell;
}

プロジェクト一覧から MainWindow.xib を選択して Interface Builder を表示させ、 「Objects」から 「Table View Controller」を選択します。 20110316_135511_2

Identity inspector を選択し、Class の部分を MyTableViewController へ変更します。 20110316_135828

以上で、ビルド/実行すると外観は無事に完成です。 20110316_140013

iPhone SDK アプリケーション開発ガイドBookiPhone SDK アプリケーション開発ガイド

著者:Jonathan Zdziarski
販売元:オライリージャパン
Amazon.co.jpで詳細を確認する

詳解 Objective-C 2.0 改訂版Book詳解 Objective-C 2.0 改訂版

著者:荻原 剛志
販売元:ソフトバンククリエイティブ
Amazon.co.jpで詳細を確認する

» 続きを読む

無料ブログはココログ

最近のコメント

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      

最近のトラックバック