統計情報(30日間)


最新情報をツイート


人気の投稿

nil / Nil / NULL / NSNull の話

このエントリーをはてなブックマークに追加

簡潔だが俯瞰として参考になる。



まとめの表

Nil ってあまり見覚えが無い。



instancetype

このエントリーをはてなブックマークに追加

instancetype なんてキーワードが使えるらしい。



こんな感じで使う(上記サイトからコピー)。
@implementation TextViewController 

- (instancetype)init
{
    self = [super initWithNibName:@"TextViewController" bundle:nil];
    if (self) {
//...
    }
    return self;
}

以下、引用
と書いてあり、@interface の中で使うと、指定の型チェックを行うことが出来る機能のようです。つまり、サブクラスの中で戻り値の型を適当に定義したときにエラーが表示されるようになるようです。idの場合は、基本的にどんな型を返してもエラーになりませんが、instancetypeを使うことによって、型チェックの機能をコンパイラで使用することが出来ます。

なるほど。なお
この instancetype は、Clang 3.0, xcode 4.3 から使用できる機能のようです。ただ、条件として、メソッドの戻り値にしか使用できないという条件があるようで、
だそうです。

Objective-Cへ名前空間を(提案)

このエントリーをはてなブックマークに追加

これは欲しい。ただ表記等はもう少し洗練した方がいいような(いいアイディアは持ってないが)。


プロパティとインスタンス変数の書き方

このエントリーをはてなブックマークに追加

いい記事。


以下、結論を転載
1.プロパティに対応するインスタンス変数はヘッダファイルで宣言する必要はまずない。(iOSのバージョンに関係なく)
2.プロパティに対応するインスタンス変数はsynthesizeで常に別名をつけるべき。
3.インスタンス変数名はプロパティ名の前に_をつけたものにする。
4.インスタンス変数にアクセスするときは、クラス内からでも常にアクセッサメソッドを通して行うようにする。(setter/getter内やinit, dealloc以外)


私も今はほぼ上記ルールで書いている。

1. の通り、ヘッダファイルのインスタンス宣言部 {}は今はまったく書いていない。

2. は、tableView とか一般的な名称をインスタンス変数で使った場合、親クラスとか、デリゲートメソッドの引数名とかでバッティングするので使いづらいという実際上の問題があるのと、セッターをカスタマイズしている時にそれが使われないという問題を回避するのに必要(逆にセッターを使わない、という記述も明示的にできる)。またセッターをカスタマイズする時も _ 付きの方が扱いやすい。ただしXibと接続するアウトレットなどはこれらに該当しないので名前を_付きに付け替えない。

3. について、今は後ろ_ にしているが、記事によるとApple推奨が前_ なのでこれは今後変えていこうと思う(GoogleのObj-C規約がそうだったからそうした。一方、プライベートなメソッドを書くときに後ろ_ は見づらいので前_を採用していたのだが、統一感がないこともありこれはどうするか考えていた)。


- - - -
なお、将来のXcode(clang)では @synthesize が不要になるとの情報をどこかで見た。もし本当にそうなった場合、この記事の調査を見る限りでは頭_ 付きのインスタンス変数が暗黙的に用意される可能性が高い。







最新 clang で @YESや dict[@"key"] が可能に

このエントリーをはてなブックマークに追加

Objective-Cのリテラル強化きた。

NSArray *array =
[NSArray arrayWithObjects: @0, @23, @3.1415, @YES, nil];
int値、float値や BOOL値 に @ を付けると NSNumberに変更される。




以下、上記サイトからの紹介。
※今回の新しいリテラル表記は clang trunk(clangの最新コード)の話で現在の Xcodeではまだ使えない。


NSArrayの初期化で @[]表記が使える。
NSArray *gronk = @[ @"hi", @"bork", @23, @YES ];


NSArray配列に []でアクセスが。
NSArray *gronk = @[ @"hi", @"bork", @23, @YES ];

NSLog (@"gronk 0: %@", gronk[0]);
NSLog (@"gronk 2: %@", gronk[2]);

入れ子
NSArray *nesting = @[ @"hi", @[ @"ohai" ] ];
NSLog (@"nesting: %@", nesting[1][0]);

-> nesting: ohai

NSMutableArrayなら代入も可能
mutt[0] = @"aaa";
mutt[3] = @"d";
mutt[4] = @"e";
さらにインデックスが範囲外の場合、自動的にインサート(insertObject:index:)される。


次に NSDictionary の初期化。"キー:値" 表記が可能に。
NSDictionary *splunge = @{ @"hi" : @"bork", @"greeble" : @"bork" };
NSLog (@"splunge %@", splunge);

->splunge {
greeble = bork;
hi = bork;
}

今までのを組み合わせるとこれが
NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:
        [NSFont userFontOfSize: 150.0],  NSFontAttributeName,
        [NSNumber numberWithFloat: 3.0], NSStrokeWidthAttributeName,
        [NSColor blueColor],             NSStrokeColorAttributeName,
        [NSNumber numberWithInt: 10],    NSKernAttributeName,
        [NSNumber numberWithFloat: 0.5], NSObliquenessAttributeName,
        nil];
こうなる
NSDictionary *attributes = @{
        NSFontAttributeName        : [NSFont userFontOfSize: 150.0],
        NSStrokeWidthAttributeName : @3.0,
        NSStrokeColorAttributeName : [NSColor blueColor],
        NSKernAttributeName        : @10,
        NSObliquenessAttributeName : @0.5
    };
すっきりしてわかりやすい。


NSDictionaryへのアクセスは [@キー]が使える。
NSDictionary *splunge = @{ @"hi" : @"bork", @"greeble" : @"bork" };

NSLog (@"%@", splunge[@"greeble"]);
NSLog (@"%@", splunge[@"ACK"]);

入れ子
NSDictionary *nest = @{ @"hi" : @"ohai",
@"ichc" : @{ @"oop" : @"ack"} };
NSLog (@"nest: %@", nest);
NSLog (@"noost: %@", nest[@"ichc"][@"oop"]);
NSLog (@"nist: %@", nest[@"ichc.oop"]); // try a key path


なお staticな宣言では利用できない。例えば下記はNG
#import

NSString *thing = @"thing 1";
NSArray *array = @[ @"thing 2" ];

@implementation BNRGroovyObject
...

- - - -
大幅なリテラル表記の新規追加はいまさら感もあるがコーディングが楽になるし可読性が増すので歓迎したい。しかし ARC導入といい、数年前の Objective-C コードとの断絶が出てきた。いっそのこと ARCと新リテラル表記で Objective-C 3.0 にした方が良かったと思うくらい。


NSMethodSignature の使い方

このエントリーをはてなブックマークに追加

結果として NSMethodSignatureの使い方解説になっている。参考になる。