2010/07/31 | 3:24 am

iPad x 3D Hologram

おお、その手があったか。と言っても全然やり方わからないスけど。。。
なんという事でしょう(← ビフォーアフター風)

N-3D DEMO from aircord on Vimeo.


aircord labo
via Fubiz

COMMENT

POSTED

jam

2010/07/30 | 0:17 am

Movie のメモリリーク of iPad

MoviePlayerController と MoviePlayerViewController どちらでも、
FullScreen ではなく、画面内に埋め込んで再生している状態で「DONE」ボタンを押すか、ちゃんと最後まで見ない状態で強制的に止めるとメモリが残ってるぽい。。。

Instruments 使って計ってみたところ、終了時のメモリの下げ幅が最後まで見た場合と強制的に終わらせた場合だと半分くらいちがうという結果。。。汗
[moviePlayer retainCount] でリファレンスカウンタの値を調べても release した時点で 4(← 謎)を吐き出す。
そもそも、なんで増えてるのかしら??
[moviePlayer stop] を呼び出すと一気に増えるのは何故??

例えば、電子カタログ系とかの構造を作るとして、スクロールでページ展開していく場合、インラインで指定エリアの中でムービーを流す予定のページで、途中で遷移したときに前のページのムービーが流れっぱなしは避けたいところ。
なので、UIScrollViewDelegate の scrollViewDidEndDecelerating: などでスクロールとページ状況を検知して前後のページの状態を初期化する方法を取ってムービーを終了させると発生してしまう模様。。うう。。

やはりちゃんとフルスクリーン表示させて「DONE」ボタンなりでちゃんと終了させないとダメっぽい。

[ソースコード]
(※親の mファイルが setMovie: を呼ぶ想定で
stopMovie が遷移したときの強制終了用のメソッドです)

- (void)setMovie:(NSString *)movieName movieArea:(CGRect)frameSize pageName:(NSString *)page {
	NSBundle *bundle = [NSBundle mainBundle];
	fileName = [[NSString alloc] initWithString:[bundle pathForResource:movieName ofType:@"m4v"]];
	currentPage = page;

	movieButton = [[UIButton alloc] initWithFrame:frameSize];
	[movieButton addTarget:self action:@selector(movieButtonTouched:) forControlEvents:UIControlEventTouchDown];
	[movieButton setBackgroundImage:[UIImage imageNamed:@"movie_capture.jpg"] forState:UIControlStateNormal];
	[self addSubview:movieButton];
}

- (void)movieButtonTouched:(id)sender {
	[movieButton removeFromSuperview];
	[self playMovie];
}

- (void)playMovie {
	moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:[NSURL fileURLWithPath:fileName]];
	[moviePlayer.view setFrame:CGRectMake( 0, 0, self.frame.size.width, self.frame.size.height )];

	[moviePlayer play];
	[self addSubview:moviePlayer.view];

	isPlayMovie = YES;

	[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayerDidFinish:) name:MPMoviePlayerPlaybackDidFinishNotification  object:moviePlayer];
}

- (void)clearMovieAsset {
	[[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:moviePlayer];

	moviePlayer.initialPlaybackTime = -1;

	[moviePlayer pause];
	[moviePlayer stop];
	[moviePlayer.view removeFromSuperview];
	[moviePlayer release];

	[self addSubview:movieButton];

	isPlayMovie = NO;
}

- (void)moviePlayerDidFinish:(NSNotification *)aNotification {
	[self clearMovieAsset];
}

- (void)stopMovie {
	if( isPlayMovie ) {
		[self clearMovieAsset];
	}
}

Build and Analyze でも leak はしていないけど、Instruments のランタイムで見てると顕著にメモリリークしてます。
うーん、うーん。。。
リファレンスカウンタ方式とガベージコレクタ方式があるから、ガベージコレクタの方も調べなければ。

COMMENT

CATEGORY

POSTED

jam

2010/07/23 | 22:17 pm

時計アプリのソース

時計アプリのソース公開するって言ってたので公開しちゃいます。
結構力技なのであしからず。。。
しかも、Impress Japan さんの「OpenGLで作るiPhone SDKゲームプログラミング」読めば、重要な部分は網羅されてるので、持ってる方は特にいらないんじゃないかしら。。。

デザインデータは僕が作ったのもじゃないので、含めることは出来ませんので、
ビルドして実行したい場合は適当な数字のグラフィックを 512×512px で作ってくださいまし。


BrooklynClock

COMMENT

CATEGORY

POSTED

jam

2010/07/23 | 2:15 am

イフォーンアプリ

先日、初めて App Store にアプリ申請して、店頭に並びました。
ほんとに普通の時計だけのアプリなんですけど。。。

screenshot

目的は単純にOpenGLの勉強ってだけでした。
時計のグラフィックとアイコン素材だけデザイナーの長澤さんに作ってもらい、
Xcode でガリガリ書く部分をやりました。

アップデートで横位置対応とかネオンの色を変更できるようにするとかしようと思います。
あと、もうちょっとリファクタリングしたらソース公開しようと思います。
汚いソースなので、ガシガシ突っ込みを頂ければと。。。


Brooklyn Clock
iTunes Store: http://itunes.com/app/brooklynclock
Support Page: http://www.brooklyn.jp/blog/brooklyn-clock

COMMENT

CATEGORY

POSTED

jam

2010/07/21 | 13:57 pm

Objective-CでFlashの非同期処理みたいなの

Objective-C で UIViewController を入れ子にしたときに、子UIViewController から親UIViewController の Function を呼びたいとき。
かなり前に書いてたのに、公開忘れてたので今公開。
こーゆーの中々覚えられないアフォーなのでメモ。。。

—————————-
AppDelegate
- ParentController
- ChildController
—————————-
という関係性があると仮定して、このときに ChildController が ParentController のメソッドを呼ぶ場合、
ParentController と ChildController に記述することス。

まず親側の .hファイルには子ファイルの .h ファイルをインポートして @interface 時に Delegate を加える。

//  ParentController.h
//
#import <UIKit/UIKit.h>
#import "ChildController.h"

@interface ParentController : UIViewController <ChildControllerDelegate> {
	ChildController	*childController;
}

@property (nonatomin, retain) ChildController *childController;

// 呼び出される Function を定義
- (void)calledFromChild;

@end

親側の .m ファイルで子の Delegate をセットする

//  ParentController.m
//

@implementation ParentController

@synthesize childController;

- (void)calledFromChild {
	NSLog(@"calledFromChild");
}

- (void)viewDidLoad {
	[super viewDidLoad];
}

- (void)didReceiveMemoryWarning {
	[super didReceiveMemoryWarning];
}

- (void)viewWillAppear:(BOOL)animated {
	ChildController *child = [[ChildController alloc]  initWithNibName:@"ChildController" bundle:nil];
	self.childController = child;
	[self.childController setDelegate:self];

	[self.view insertSubview:childController.view atIndex:0];
}

- (void)viewDidUnload {
	[super viewDidUnload];
}

- (void)dealloc {
	[super dealloc];
}

@end

次に子側の .h ファイルには protocol で Delegate と @optional で呼び出すメソッドを設定

//  ChildController.h
//

#import <UIKit/UIKit.h>

@protocol ChildControllerDelegate;

@interface ChildController : UIViewController {
	UIButton *checkButton;	// InterfaceBuilder で配置したボタンと仮定
	id <ChildControllerDelegate> delegate;
}

@property (nonatomic, retain) IBOutlet UIButton *checkButton;
@property (nonatomic, assign) id <ChildControllerDelegate> delegate;

- (IBAction)clickCheckButton:(id)sender;	// InterfaceBuilder で checkButton と関連づける

@end

@protocol ChildControllerDelegate <NSObject>

@optional
- (void)calledFromChild;	// ParentController で定義したメソッドと同じ名前

@end

それで子側の .m ファイルで delegate で親側のメソッドを実行

//  ChildController.m
//  

#import "ChildController.h"

@implementation ChildController

@synthesize checkButton, delegate;

#pragma mark -

// 実際に呼び出すメソッド
- (IBAction)clickCheckButton:(id)sender {
	if( [delegate respondsToSelector:@selector(calledFromChild)] )
		[delegate calledFromChild];
}

- (void)viewDidLoad {
	[super viewDidLoad];
}

- (void)viewDidUnload {
	checkButton = nil;
	[super viewDidUnload];
}

- (void)dealloc {
	[checkButton release];
	[super dealloc];
}

@end

これで、checkButton に関連づけられたボタンにタッチしたときに
Xcode の[実行]-[コンソール]で表示されるウィンドウに「calledFromChild」って表示されます。
子側の処理を待ってから、親側でごにょごにょするときに使える。

COMMENT

CATEGORY

POSTED

jam

2010/06/18 | 12:28 pm

Apple 製品の寸法一覧

今、市場に出ている(販売終了含む)製品の寸法が全部手に入るようです。
ケースを自作したい型いましたら是非〜


Designing cases for iPod, iPhone, and iPad

COMMENT

CATEGORY

POSTED

jam

2010/06/17 | 11:51 am

FFT for iPhone

買う。

いやー、行き帰りの電車の読書がゲームに取って代わられそうだ。。。
まさかの仕事しなくなるとかもありえる。。。

うーん

COMMENT

CATEGORY

POSTED

jam

2010/04/30 | 13:13 pm

iPhone の実機テスト

何回やっても覚えてられないアルツハイマー症候群疑惑なので、実機テストの追加方法のメモ。

————————————————
1.
http://developer.apple.com/iphone/
から自分のアカウントでログイン。

2.
右側のカラムにある「Provisioning Portal」を選択

3.
左側のメニューから「Device」を選んで「Manage」タブを選択(デフォルトだけど)
それから右端のほうにある「Add Device」を選択

4.
Device Name(任意)と
Device ID(Xcodeのオーガナイザ画面のIdentifierってやつ)を入力して
「Submit」をクリック

5.
今度は左側のメニューから「Provisioning」を選んで
それから右端のほうにある「New Profile」を選択。

6.
新しい Profile Name を付けて Certificates、App ID を選択後、
Devices で 3 で加えたデバイスにチェック(Select All すればいい)。
そしたら「Submit」をクリック

7.
そうすると新しくできた Provisioning Profile の status が Pending になるので、
画面を F5 とか command+R とかで一回リフレッシュ。

8.
「Download」ボタンが出てくるので、デスクトップとかにダウンロードしたら
ダブルクリックか、Xcode にドラッグでおk
————————————————

左側のメニュー選択後のそれぞれの中面ページのタブの名前が被ってて、たまに混乱する。。。
アルツハイマー症候群疑惑だから、余計に自分がクリックした場所忘れる。

でも基本的には Devices と Provisioning しか行き来しない(はず)です。

COMMENT

CATEGORY

POSTED

jam

2010/03/15 | 2:45 am

iPhone wireless chager

DOC でもなく、iPhone の下部にコネクタ接続するでもなく充電できるキット。
専用のスキンにする必要があるけど、これはすごい。
ACコードの電源コネクタがあれば、どこでも充電可能だそうで。


CASE MATE

COMMENT

CATEGORY

POSTED

jam

2010/01/03 | 5:16 am

ADC の申請おりない。。

iPhone の開発で Apple Developer Connection の iPhone Developer Program に申請だして、一週間。
ログイン画面の次から一向に進みません。。泣

「We are processing your request. Please wait a few moments then refresh this page.」って表示されたまま全く進む気配がない。
まさか謎のキャッシュ??って思って、いろんなブラウザで試しても変わらず。。
few moments で一週間はちょっと待たせ過ぎよね、おい。

そんとき、「クリスマスから年末年始でお休みなんじゃない?」って彼女さんから痛烈なコメント。
あり得るから怖いよね、アメリカ。。。
休み中にちょっと弄くってみようかと思ってたら、全然自分の実機でテストできねーって最低のオチ、いやん。
もう倍額の2万払うから今すぐ認可してくだせー、おねげーしますよー

いろんなブログとかでも、アプリ申請後の認可がおりないとか書かれてましたけど、そもそもスタートラインに全く立つ事が出来ない悲しい年末年始。
こーゆー場合、渋谷 Apple Store の2階の人たちに相談って出来るのかしら??
それともあれって商品だけ??

CATEGORY

POSTED

jam

JUN NAKAJIMA
Tokyo, Japan.
member of Onawatobi.
contact@brooklyn.jp