2011年2月11日金曜日

Cocoa ObjC 初めてクラスを書いてみる

1からまだクラスを書いたことがなかった。ちょうど「実行中のアプリ情報」を保持する仕組みが必要になったので自分で書いてみる。

人のコードをカットアンドペーストして、じっくり読んでそれを応用する、というスタイルで今のところきている。初心者にはちょうどいい勉強法。しかし実際に自分で書くとなると、知識がいかにいいかげんか痛感する。

とりあえず、実行中のアプリを保持するためのクラスのヘッダ。
#import 


@interface SPApp : NSObject {
 NSString* _name;
 NSImage* _icon;
 pid_t _pid;

}
-(id)initWithRunningApp:(NSRunningApplication*)aApp;
@property(readonly) NSString* _name;
@property(readonly) NSImage* _icon;
@property(readonly) pid_t _pid;

@end


そしてimplementation。
#import "SPApp.h"
#define ICON_SIZE 32

@implementation SPApp
@synthesize _name;
@synthesize _icon;
@synthesize _pid;
-(id)initWithRunningApp:(NSRunningApplication *)aApp{
 self=[super init];
 if (self) {
  _name=[[aApp localizedName] retain];
  _icon=[[aApp icon] retain];
  [_icon setSize:NSMakeSize(ICON_SIZE,ICON_SIZE)];
  _pid=[aApp processIdentifier];
 }
 return self;
}
-(void)dealloc{
 [_name release];
 [_icon release];
 [super dealloc];
}
@end

dealocが本当に必要なのか今イチ自信がない。しかし今のところ不都合はないようだ。クラッシュとか。プロパティとかアクセサとか、書いてみないと書き方がわからないものだなあ。

retainってどこでどうやって使うんだかまだまださっぱり理解していないが、ここでつけないとコンパイラに怒られる。

自分でコードを書くときは

詳解 Objective-C 2.0 改訂版
荻原 剛志
ソフトバンククリエイティブ
売り上げランキング: 2710

この本と首っ引き。買っておいてよかった。これがないと到底クラスなんか書けなかったぞ。

MacRubyで書きかけていたアプリは、タスクスイッチャみたいな機能をつけたところで止まっている。起動中のアプリを取得して、それをサブメニューの中に仕込んで、というところまでいって、じゃあメニュー以外の表現方法にしてみよう、となってなぜかObjCの勉強をしている。本当に気まぐれだな。
MacRubyでつくっていた「Spin」と同じような機能のアプリを作成中で、今度は透明ウィンドウの中に起動中のアプリを何らかの方法で表示しようとしている。

はたしてうまくいくか・・・。Viewの勉強をもっとしなければ。

0 件のコメント:

コメントを投稿