WWDC、E3、Objective-C のブロックと変数

WWDC 2012 基調講演が、11日午前10時 (日本時間、翌12日午前2時) に開催されました。Mac Book Air / Pro、iOS 6、OS X Mountain Lion の発表がありましたが、一番の関心は、Retina ディスプレイ MacBook Pro の発表です。iPadiPhone アプリ開発のために、iMac 27 インチを使用してきましたが、Retina ディスプレイ MacBook Pro でも問題なさそうです。所有してる iMac (Mid 2010) 27 インチは、Thunderbolt、USB 3.0 に対応していないので、購入時期も迫ってきています。Retina ディスプレイ iMac が発表されていたら、間違いなく購入していました。もう一年、我慢しようか、悩みどころです。

基調講演は、Apple のサイト

Apple - Apple Events - Apple Special Event March 2012
http://events.apple.com.edgesuite.net/123pibhargjknawdconwecown/event/index.html

で見れます。Podcast でも配信されています。

iTunes - Podcast - Apple Inc.「Apple Keynotes」
http://itunes.apple.com/jp/podcast/apple-keynotes/id275834665
iTunes - Podcast - Apple Inc.「Apple Keynotes (1080p)」
http://itunes.apple.com/jp/podcast/apple-keynotes-1080p/id509310064
iTunes - Podcast - Apple Inc.「Apple Keynotes (HD)」
http://itunes.apple.com/jp/podcast/apple-keynotes-hd/id470664050

1080p、HD 版も配信されています。

E3 も開催されていました。

E3 2012 - GameSpot.com
http://e3.gamespot.com/

上のサイト、左上の赤の背景に白色の文字で E3 2012 と表示されている部分をクリックし、Press Conferences を選ぶとそれぞれの基調講演を見ることができます。また、任天堂の基調講演は

任天堂 E3 2012情報 | E3レポート
http://www.nintendo.co.jp/n10/e3_2012/report/index.html

でも見れます。

以前、[id:KYoshiaki:20120429] iCloud プログラミングで書いた

Creating iOS 5 Apps: Develop and Design

Creating iOS 5 Apps: Develop and Design

[Kindle 版] と復習のために買った

Objective-C Programming: The Big Nerd Ranch Guide (Big Nerd Ranch Guides)

Objective-C Programming: The Big Nerd Ranch Guide (Big Nerd Ranch Guides)

[Kindle 版] を読み終えました。

Blocks とスコープ外の変数について、理解が深まりました。

typedef void (^ArrayEnumerationBlock)(id, NSUInteger, BOOL *);
ArrayEnumerationBlock devowelizer;
NSMutableArray *newStrings = [NSMutableArray array];
devowelizer = ^(id string, NSUInteger i, BOOL *stop) {
NSMutableString *newString = [NSMutableString stringWithString:string];
for (NSString *s in vowels) {
NSRange fullRange = NSMakeRange(0, [newString length]);
[newString replaceOccurrencesOfString:s withString:@"" options:NSCaseInsensitiveSearch range:fullRange];
}
[newStrings addObject:newString];
};
[oldStrings enumerateObjectsUsingBlock:devowelizer];

上のように、block 内で

[newStrings addObject:newString];

とスコープ外の変数 newStrings の内容を変更することができます。これは、メソッドを呼んでいるからです。プロパティで代入する場合も、同じです。

typedef void (^SampleBlock)();
__block NSString *two = [NSString stringWithString:@"two"];
SampleBlock sampleBlock;
FooClass *fooClass;
fooClass = [[FooClass alloc] init];
sampleBlock = ^() {
NSString *three = [NSString stringWithString:@"three"];
fooClass.foo = [NSString stringWithString:@"Orange"];
two = three;
changeValue(8);
};
sampleBlock();

ブロック内で

fooClass.foo = [NSString stringWithString:@"Orange"];

と代入することができます。ここでは、説明しやすいように

self.foo = bar;

とします。

実際には、ドット演算子を使ったプロパティは

The Objective-C Programming Language: Declared Properties
https://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProperties.html#//apple_ref/doc/uid/TP30001163-CH17-SW1
▼ Declared Properties
▼ Property Declaration and Implementation
Property Declaration
Key-Value Coding Programming Guide: Key-Value Coding Fundamentals
https://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/KeyValueCoding/Articles/BasicPrinciples.html#//apple_ref/doc/uid/20002170-BA
▼Key-Value Coding Fundamentals
Dot Syntax and Key-Value Coding

を利用しているので

[self setFoo:bar];

または

[self setValue:bar forKey:@"foo"];

と同一です。故にメソッドを使っているので、block 内で代入できます。

foo = bar;

は、block 内で使えないので注意してください。foo が Objective-C のオブジェクト、または int、double などのスカラー型いずれの場合でも、__block を宣言しない限り、ブロック内では代入できません。

sample(bar);

上のような C の関数は、ブロック内で使えます。

結局、Cの関数、Objective-C の method は、ブロック内で使うことができます。また、プロパティを使ったドット表記も、実際には method を使っているので、ブロック内で使えます。ブロック内でスコープ外の変数に = (イコール) を使った代入は、__block を宣言しないと使えません。

サンプルとして zip ファイルを公開します。

VowelMovement.zip
http://kyoshiaki.sakura.ne.jp/osx/Sample/VowelMovement.zip
Creating iOS 5 Apps: Develop and Design

Creating iOS 5 Apps: Develop and Design

[Kindle 版] で見つけた面白い Blocks の使い方のサンプルも下記 URL で公開します。

Weights.zip
http://kyoshiaki.sakura.ne.jp/osx/Sample/Weights.zip

サンプルは、[ Creating iOS 5 Apps: Develop and Design ] [Kindle 版] のソースから、面白い使い方の箇所を抜き出して修正したものです。

//
//	Weights.m
//
- (void)processWeightEntryUsingBlock:(void (^)(NSNumber*)) block
{
NSLog(@"Weights.entries: %@", self.entries);
for (NSNumber* entry in self.entries) {
block(entry);
}
}
//
//	States.m
//
-(void)doStates
{
NSMutableArray *array;
array = [NSMutableArray array];
[self.weights processWeightEntryUsingBlock:^(NSNumber *number) {
int value;
NSNumber *num;
value = [number intValue];
num = [NSNumber numberWithInt:value*2];
[array addObject:num];
}];
NSLog(@"processWeightEntryUsingBlock: %@", array);
}

ニンテンドーDSi/DSi LL/3DS の DSi ウェア 'プチコンmkII' 上で動作する Neko version 1.0.0 の QR コード公開

ニンテンドーDSi/DSi LL/3DSDSi ウェア ‘プチコンmkII’ 上で動作する Neko version 1.0.0 の QR コードを下記 URL

プチコンmkII 版 Neko Version 1.0.0
http://kyoshiaki.sakura.ne.jp/osx/petitcom.html#neko100

で公開します。

いろいろな OS に移植されている Neko

Neko (ソフトウェア) - Wikipedia
http://ja.wikipedia.org/wiki/Neko_(%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2)

を ‘プチコンmkII’ 上で動作するようにプログラミングしたものです。

簡単に言うとペンでタッチした方向に、猫が駆け回るプログラムです。

画像データは、Zaurus の BASIC ‘9B’ 上で動作する拙作 Neko Ver 1.0 のデータを

DSPCBMP_153
プチコン MkII プログラム
http://www.aogondo.net/PetitCom/

DSPCBMP を使って CHR データに変換しました。このプログラムがなければ、こんなに簡単に移植できなかったと思います。

また、

UX_CHRED
プチコンmkII うpろだ | uploader.jp
http://ux.getuploader.com/petitcom_mkII/index/2/date/desc

UX_CHRED を使って画像を修正しました。

上の画像は CHR データを UX_CHRED で表示した状態です。UX_CHRED は、SPRITE や BG 用のキャラ画像をつくる純正の CHRED にはない高機能なツールです。

プログラムの変数、SPMAXを書き換えることで猫の数を変更できますが、猫の衝突処理や実行中に猫の数を変更できるようにすると面白いかもしれません。

'プチコンmkII' 上で動作するマインスイーパの QR コード公開、新しい iPad 購入。

プチコンmkII’ 上で動作するマインスイーパの QR コードを下記 URL で公開します。

Yoshiaki's HomePage - プチコンmkII
プチコンmkII版マインスイーパ Version 1.0.0
http://kyoshiaki.sakura.ne.jp/osx/petitcom.html

良かったら、遊んでみてください。

Twitterハッシュタグ #ptcmqr でいろいろな ‘プチコンmkII’ の QR コードが公開されていますが、

SHOHD
QRコード32枚
投稿プログラム : ホラーダンジョン - プチコンまとめWiki
http://wiki.hosiken.jp/petc/?Toukou%2F%A5%DB%A5%E9%A1%BC%A5%C0%A5%F3%A5%B8%A5%E7%A5%F3
GN_TRK03
StarTrek for Petitcom
http://www2.u-netsurf.ne.jp/~ozawa/startrek/startrek.html
コマンドの詳しい解説は
Star Trek
http://www.dunnington.u-net.com/public/startrek/
で紹介されているリンク先ファイル TREK.DOC [ http://www.dunnington.u-net.com/public/startrek/TREK.DOC ] が参考になります。
KYMTREK
スタートレック
http://www1.odn.ne.jp/beni/petitcom/trek/list.html
SPEHURRI
SPECTACLE HURRICANE
『プチコン』のページ
http://www1.ocn.ne.jp/~tabby/games/ds_kkoj.html
http://www1.ocn.ne.jp/~tabby/games/ds_knaj.html
RE201
Reflect EDGE Ver2.01
http://www.geocities.jp/sp1_ssr/ReflectEDGE1.htm
TINYKITT
プチコンmkII用「ナンジグライダー」
プチコン関連
http://www.geocities.jp/tiny_yarou/petitcom/index.html
(Safari で見る場合は、メニュー/表示/テキストエンコーディング:日本語 (EUC) を選択してください。)
DROPPZL
ありそうで無かった「逆テ○リス?」
http://www.ma.mctv.ne.jp/~miche/ptc/hare/index.html
GRPSHP2P
お絵描きツール
mkII - 湯飲実験室 (QRコードと操作説明)
http://www.sotohane.com/2012/03/mkii.html#more
QRコード
http://twitpic.com/8y4hgw
G2MMLEX
G2MMLSMP
プチコンmkIIのMMLをマクロ対応にするプログラム
http://www.gradius2.com/index.php?UID=1332082863
OCHAOSP
自動歌唱ソフト OSP
OCHAOSP2
棒歌ロイド OSP2
http://ww5.tiki.ne.jp/~ochame/petitcom/1page.htm#osp
MRPLAY
MML音色試聴ツール
http://twitpic.com/8zrzq2
S51PTCL3
投稿プログラム : PetitcoLOID - プチコンまとめWiki
http://wiki.hosiken.jp/petc/?Toukou%2FPetitcoLOID

がお勧めです。後、プログラムの中断は ‘SELECT ボタン’ を押してください。

Apple が 2012年3月7日(水)AM10時 (PST) [日本時間 2012年3月8日(木)AM3時] より、米カリフォルニア州サンフランシスコの Yerba Buena Center for the Arts(YBCA)でスペシャルイベントを開催しました。新しい iPadiOS 5.1が発表されました。早速、iOS 5.1にアップデートしました。iPhone 4S を持っていないので Siri を試せないのが、残念です。

初代 iPad は、購入しました。しかし iPad 2 は Retina Display に対応していなかったので、見送りました。新しい iPad は、発表があってからすぐに ‘ホワイト WiFiモデル 32GB’ を予約しました。16日に到着しました。拙作 iYKRSSHD [ http://itunes.com/apps/iYKRSSHD ] になるべく早く対応したいです。iCloud を勉強中なので、アプリに活かしてみたいですね!