• 締切済み

Objective-Cで、スレッドを作成したいのですが引数をどのように

Objective-Cで、スレッドを作成したいのですが引数をどのように定義するのか構文がわかりません。 [NSThread detachNewThreadSelector:@selector(test) toTarget:self withObject:self]; // A - (void)test { NSLog(@"スレッド実行"); } ですが、 - (void)test(NSString *msg) { NSLog(@"スレッド実行 msg=[%@]", msg); } の場合のAの書き方です。

  • pone1
  • お礼率14% (9/62)

みんなの回答

  • harawo
  • ベストアンサー率58% (3742/6450)
回答No.2

NSThreadのClass Referenceから引用します。 + (void)detachNewThreadSelector:(SEL)aSelector toTarget:(id)aTarget withObject:(id)anArgument Parameters aSelector The selector for the message to send to the target. This selector must take only one argument and must not have a return value. aTarget The object that will receive the message aSelector on the new thread. anArgument The single argument passed to the target. May be nil. 紛れがでそうな、複数の解釈が可能な箇所もなく、そのまま読めば、そのとおり理解できる内容だと思われますが? ※あなたの質問についた回答に対しては、たとえあなたの気に入らない内容であったとしても、お礼なり補足なりをして、無視なさらぬようにお願いします。

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

手元にObjCが使える環境ないから試さないで書いてますが、Aの書き方はあっていそうな(※)。 「-test()」って書き方のほうが問題のような。コンパイル通ります? 1引数セレクタなら「-test:」では。 ※withObjectの引数がselfなのが妥当かどうかは別です。

関連するQ&A

  • objective-cでの引数について

    お世話になります。 引数の使い方について以下の様な事が可能なのか分からなくて困ってしまい質問します。 検索等は行いましたが目的のものが見つからなかったので、、 以下ですが、あるボタンをタップすると、buttonDidPushを実行するプログラムがあったとします。 @implementation ViewController -(void)viewDidLoad{ ~中略~ [button addTarget: self action:@selector(buttonDidPush) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:button]; } -(void)buttonDidPush{    処理 } @end ここで聞きたいのは、 ボタンのところで、引数(数値変数 x )をbuttonDidPushに持っていくことができるかどうかなのですが、 例えば以下のように変更しました。 action:@selector(buttonDidPush) ↓ action:@selector(buttonDidPush:x:) -(void)buttonDidPush{ ↓ -(void)buttonDidPush(Integer)x{ としましたが、build successで一応シミュレータは動きましたが、 ボタンをタップするとmain.mのほうでエラーが出てしまい動きませんでした。 なんとなく文法が間違ってるんじゃないかと思いますが、どこか心当たりのある方、よろしくお願いいたします。 尚、数値xはintで宣言済みです。 main.mでのエラー内容は int retval = UIApplicationMain(argc, argv, nil, @"testAppDelegate"); のラインで、「Thread1:Program received signal: ""SIGABRT.」と出ていました。 また、私自身が何かobjective-cの文法について重大な勘違いをしている可能性もあります・・

  • Objective-CのNSThreadで作ったthreadを外部から

    Objective-CのNSThreadで作ったthreadを外部から終了させる 現在Iphoneでプログラミングをしているのですが、Threadをthread処理外から終了させるためにはどうしたらいいのかで、悩んでいます。 ソースコードで説明させていただくと -(void)main {   [NSThread detachNewThreadSelector:@selector(thread) toTarget:self withObject:[NSNumber numberWithInt:1]]; [NSThread exit];//このような処理したい } -(void)thread {   while(true)   {   } } ご回答よろしくおねがいします。

  • Objective-C,NSTimerを使って1秒毎に10秒かかる処理

    Objective-C,NSTimerを使って1秒毎に10秒かかる処理を実行させる事ってできますか? 例えば、以下に書いたとすると、(行頭全角スペースです。) @interface testTimer : NSObject {  NSTimer *timer; } @end @implementation testTimer - (id) init { timer = [NSTimer scheduledTimerWithTimeInterval:1.0  target: self  selector:@selector(timeUpdate:)  userInfo:nil  repeats:YES]; } - (void) timeUpdate:(id)sender {  NSLog(@"%@",[NSDate date]);   [NSThread sleepUntilDate:[[NSDate date] addTimeInterval:10.0]]; } @end 毎秒タイムスタンプは出力されませんでした。 以上、ご指導の程、よろしくお願いいたします。

  • objective-cにはCのような関数はない?

    c言語とobjective-cを並行して勉強しています。 c言語では機能をまとめるために関数を定義できますよね。 ----- void display(int a){ printf("%d" , a); } int main(void){ display(10); } --- これでdisplayという関数に10という引数を渡して表示させることができますよね? objective-cの場合は例えば以下のように書くことがわかり、コンパイルも通りました。 - (void)display{ NSlog(@" TEST "); } しかし・・・・呼び出すことができませんね。。。 objective-cの場合は[ インスタンス メソッド名 ]; のような呼び方なのですよね。 メソッドだけを呼び出すことはできない、ってことなのでしょうか・・・? 色々検索してみたのですが、 @implement~@endで囲んでクラスにして インスタンスを作って、メソッドを呼ぶ方法ばかりで、 上記のC言語の例のような、単純な関数定義→呼び出しの方法を見つけることができませんでした。 上記のようなC言語の例はよくあると思うのですが、 これと同じことがobjective-cで、できるともできないとも、書いてないように思います。 例えば上のc言語と同じ動作をobjective-c に移植するとどうなるのでしょうか・・・?というか、不可能、ということでしょうか・・・?

  • Swift,Objective-Cのselecto

    現在、Swiftでアプリを作成しているプログラミング初心者です。selectorについて、サルでも解るレベルで、具体例を交えて教えて頂けないでしょうか。 ソースコードも是非、ご提示頂ければ助かるのですが、Objective-Cは未学習です。クラス、メソッド、引数などの基本的な意味、構文などは理解しています。

    • ベストアンサー
    • Swift
  • Objective-Cでのエラー

    よろしくお願いします。「Xcode5ではじめるObjective-Cプログラミング(大津真著)」という本を購入し、Objective-Cの勉強をはじめました。Objective-Cが初めてのプログラミング初心者です。 本に記載されたコードを入力しているのですが、下記でエラーが出て困っています。 何度も見なおしたのですが本との違いを見つけることができませんでした。 どこがおかしいのかお分かりの方がおられましたらどうか教えて下さい。 ●エラー more '%' conversions than data arguments が、下記の2箇所で出ます。(いずれも生年月日の前の@ に矢印がでています。) >NSLog(@"%@ 生年月日:%@, 身長:%.1fcm"), >NSLog(@"%@ 生年月日:%@, 身長:%.1fcm"), 実行すると Thread 1:EXC_BAD_ACCESS(code=EXC_1386_GPFLT) とでます。 ---------- // main.m #import <Foundation/Foundation.h> #import "Person.h" int main(int argc, const char * argv[]) { @autoreleasepool { Person *personA = [[Person alloc]init]; [personA setName:@"吉田一郎"]; NSDate *dateA = [NSDate dateWithString:@"1979-11-12 00:00:00 +0900"]; [personA setBirthday:dateA]; [personA setHeight:180.5]; NSLog(@"%@ 生年月日:%@, 身長:%.1fcm"), [personA name], [personA birthday], [personA height]; Person *personB = [[Person alloc]init]; [personB setName:@"山田太郎"]; NSDate *dateB = [NSDate dateWithString:@"1981-03-01 00:00:00 +0900"]; [personB setBirthday:dateB]; [personB setHeight:172.3]; NSLog(@"%@ 生年月日:%@, 身長:%.1fcm"), [personB name], [personB birthday], [personB height]; } return 0; } ---------- // Person.h #import <Foundation/Foundation.h> @interface Person : NSObject -(void)setName:(NSString *)name; -(NSString *)name; -(void)setBirthday:(NSDate *)birthday; -(NSDate *)birthday; -(double)height; -(void)setHeight:(double)newValue; @end ---------- // Person.m #import "Person.h" @implementation Person { NSString *_name; NSDate *_birthday; double _height; } -(void)setName:(NSString *)aName { _name = aName; } -(NSString *)name { return _name; } -(void)setBirthday:(NSDate *)aBirthday { _birthday = aBirthday; } -(NSDate *)birthday { return _birthday; } -(void)setHeight:(double)aHeight { _height = aHeight; } -(double)height { return _height; } @end

  • Objective-CのNSTaskからAutomatorで作成したア

    Objective-CのNSTaskからAutomatorで作成したアプリを複数回実行するとフリーズするのですが、原因が分からないのでアドバイスをいただきたく書き込みさせていただきます。 Automatorの処理は、「イメージファイルにサムネールアイコンを追加」するだけの処理です。1度の実行で複数枚の画像を1枚ずつAutomatorに渡して処理を行います。 Automatorの実行は以下のような内容で実行しています。 -(BOOL)imageIcon(NSString *)filePath // 画像ファイルパス { NSTask *task = [[NSTask alloc]init]; NSURL *urlfilePath = [NSURL fileURLWithPath:filePath]; NSString *Command = [NSString stringWithFormat:@"/usr/bin/open"]; NSArray *argumets = [NSArray arrayWithObjects:@"-a", @"Automatorアプリのパス", [NSString stringWithFormat:@"%@",urlfilePath], nil]; [task setLaunchPath:Command]; [task setArguments:argumets]; [task launch]; [task waitUntilExit]; // 処理が完了していないのに処理を継続するのを防ぐ為、sleep [NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:3]]; if([self processList:@"Automatorアプリ名"]){ //psコマンドを実行して、処理中ならYESを返す。 [NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:3]]; } [task release]; return YES; } 上記の関数を各画像の処理時に呼び出しています。 上記の関数の先頭部にreturn YESで強制的に処理をすると、フリーズは発生しません。 また、フリーズした時は、Automatorアプリが実行中のままとなりますが、アクテビティモニタで見るとAutomatorアプリはありません。 Xcodeのコンソールにも、何も表示はありません。 説明がまとまっていなくてすいません。 どなたか、Objective-Cに精通されておられるかたおられまいたら、アドバイスをお願い致します。

  • objective c 1文字ずつ表示

    調べてみたところ、NSTimerと言う関数を見つけて 0.05fずつ反応する媒体が出来ました。 -(id)init{ timer = [NSTimer scheduledTimerWithTimeInterval:0.05f target:self selector:@selector(timetime:) userInfo:nil repeats:YES ]; return self; } -(void)timetime:(NSTimer *)time{i++; NSLog(@"この機能を利用してノベル風テキスト出力をしたいです"); } コレを利用してノベルゲーム風に1文字ずつ表示したいのですが、 何か方法はありませんか?

  • Objective-CとCの結合について

    今Cの関数から文字列をもらってObjective-Cでウィンドウに表示させようとしているのですが、initWithCStringとかstringWithCStringの使い方がよくわかりません。今具体的にいうと #import "test.h" @implementation test +(void) testes:(NSString *)aaaa { [ output setStringValue : aaaa ]; } @end void Output_window(char *cccc) { NSString *aaaa; aaaa = [aaaa initWithString:aaaa]; [test testes : aaaa]; } こんなソースを書いてます。*ccccはCの文字列でoutputはoutletです。Output_windowをCソースのほうで呼び出して文字列をもらっています。どこがおかしいんでしょうか?指摘していただけませんか?最後の行でwarningが出るんですがそこだけがおかしいのかよくわかりません。Objective-Cをはじめて一週間程度ですので文法のことがいまいちよくわからないのでよろしくお願いします。 環境はMacOSX、ProjectBuilderとInterfaceBuilderでcocoaです。

  • objective-C メソッドの呼び出しについて

    こんばんは。objective-Cについて教えてください。 クラス間でのメソッドの呼び出しについてです(果たしてこの言い方であってるのかも怪しいですが…) 例えば、 aクラスの実装ファイル -(void)setUpView {  self.checkButton = [[UIButton buttonWithType:UIButtonTypeRoundedRect] retain]; [self.checkoutButton setTitle:@"チェック" forState:UIControlStateNormal]; [self.completeCheckoutButton addTarget:self                 action:@selector(checkAction)         forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:self.checkButton]; } -(void)checkAction {   処理 } これで同じクラス内でのメソッドの呼び出しはできていると思いますが、 bクラスの実装ファイルに書いたメソッドを処理として追加したい場合はどう書いたらいいのでしょうか? 一通り調べたつもりですが、もし過去にも同じ質問がありましたら申し訳ありません。 もし説明が足りない場合は補足させていただきますので、どなたかよろしくお願いします。