Entries

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
この記事に対してトラックバックを送信する(FC2ブログユーザー)
http://kovayashi.blog120.fc2.com/tb.php/109-f6731b48

-件のトラックバック

-件のコメント

コメントの投稿

投稿フォーム
投稿した内容は管理者にだけ閲覧出来ます

【Objective-C】オブジェクトのメソッドを実行時に条件によって変えたい。

例えば、あるオブジェクトに対して、引数がAならメソッドAを、引数がBならメソッドBを呼ぶ。Rubyだと__send__を使ってこんな感じ

#!/usr/bin/ruby

class Sel
attr_reader :val

def setA
@val='A'
end

def setB
@val='B'
end
end

return -1 if ARGV.length !=1 || (ARGV[0]!='A' && ARGV[0]!='B')
sel=Sel.new()
sel.__send__(ARGV[0]=='A' ? 'setA' : 'setB')
puts sel.val


これを、Objective-Cで書くと、

● sel.h

#import <Foundation/NSObject.h>
#import <Foundation/NSString.h>

@interface Sel : NSObject {
NSString *val;
}
@property(readonly) NSString *val;
- (void)setA;
- (void)setB;
@end

● sel.m

#import "Sel.h"

@implementation Sel : NSObject

@synthesize val;
- (void)setA {
[val release];
val = [NSString stringWithCString: "A" encoding: NSUTF8StringEncoding];
}

- (void)setB {
[val release];
val = [NSString stringWithCString: "B" encoding: NSUTF8StringEncoding];
}
@end

● main.m

#include <string.h>
#import <Foundation/Foundation.h>
#import "Sel.h"

int main(int argc,char *argv[]) {
if(argc != 2 || (strcmp(argv[1], "A") != 0 && strcmp(argv[1], "B") != 0)){
return -1;
}
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
Sel *sel = [[Sel alloc] init];
SEL method = strcmp(argv[1], "A") == 0 ? @selector(setA) : @selector(setB);
//[sel perform: method];
[sel performSelector: method];
NSLog(@"%@",sel.val);
[sel release];
[pool release];
return 0;
}

で、コンパイル

>gcc -o sel *.m -framework Foundation

メモリへの気遣いの所は、こんな感じでイイのか自信がない。

以下参考にしたページ。
http://wisdom.sakura.ne.jp/programming/objc/objc13.html
http://developer.apple.com/jp/documentation/Cocoa/Conceptual/ObjectiveC/3objc_language_overview/chapter_7_section_6.html



この記事に対してトラックバックを送信する(FC2ブログユーザー)
http://kovayashi.blog120.fc2.com/tb.php/109-f6731b48

0件のトラックバック

0件のコメント

コメントの投稿

投稿フォーム
投稿した内容は管理者にだけ閲覧出来ます

Appendix

プロフィール

kovayashi

Author:kovayashi
・嫌いなもの
 →好きなもの

・インストール
 →バンドル
・バックアップ
 →アップロード
・努力
 →チート

最近のトラックバック

ブログ内検索

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。