1 :デフォルトの名無しさん:2012/02/27(月) 17:21:46.39
Objective-C(オブジェクティブ シー)はプログラミング言語の一種。C言語をベースにSmalltalk型のオブジェクト指向機能を持たせた上位互換言語。
 (Wikipedia:http://ja.wikipedia.org/wiki/Objective-C より)

Objective-C [ObjC part:6];
http://toro.2ch.net/test/read.cgi/tech/1313891268/

Objective-C [ObjC part:5];
http://hibari.2ch.net/test/read.cgi/tech/1279730299/

Objective-C [ObjC part:4];
http://pc12.2ch.net/test/read.cgi/tech/1239721860/

Objective-C [ObjC part:3];
http://pc12.2ch.net/test/read.cgi/tech/1186543111/

Objective-C
http://pc11.2ch.net/test/read.cgi/tech/1106983092/

Objective-C
http://pc5.2ch.net/tech/kako/990/990574267.html

2 :デフォルトの名無しさん:2012/02/27(月) 17:23:02.21
*** プログラム技術板 ***
【マック】Macintoshプログラミング質問箱
http://toro.2ch.net/test/read.cgi/tech/1113058054/

*** 新・mac板 ***
Cocoaはさっぱり!!! version.16
http://anago.2ch.net/test/read.cgi/mac/1307162542/

Macでプログラミング{10}
http://anago.2ch.net/test/read.cgi/mac/1248682344/

iPod touch/iPhone ネイティブアプリ製作 ver.16
http://anago.2ch.net/test/read.cgi/mac/1312723856/

3 :デフォルトの名無しさん:2012/02/27(月) 17:23:48.25
*** 本家 ***
Objective-C 2.0 プログラミング言語
http://developer.apple.com/jp/documentation/Cocoa/Conceptual/ObjectiveC/

Introduction to The Objective-C 2.0 Programming Language
http://developer.apple.com/documentation/Cocoa/Conceptual/ObjectiveC/Introduction/introObjectiveC.html

そのほか英語
http://developer.apple.com/documentation/Cocoa/ObjectiveCLanguage-date.html

*** 書籍 ***
荻原本 第3版
http://amazon.jp/dp/4797368276

HMDTダイナミック本
http://amazon.jp/dp/4861006414

195 :デフォルトの名無しさん:2012/06/03(日) 21:07:21.67
そんなんで満足するわけねーだろ!クソが
笑いなんて要らねーんだよ。
普通でいいんだよ。贅沢は言わない。普通で。
iphoneの開発はしたいから本買ってきたらアップルのどこかでダウンロードしろって書いてあったから
しようと思ったら英語でわからんかった。
お前らはどうやって分かった?
英語できるやつばかりか?

302 :デフォルトの名無しさん:2012/06/14(木) 23:01:12.97
[delegate AdelegateMethod:...]
と、Aクラス内(でなくてもいいんだけど)で実行され、delegate の AdelegateMethod:... が呼ばれるだけ
BクラスオブジェクトでA.delegate=self と事前にしているなら、delegateがBクラスオブジェクトなんだから、Bクラスのメソッド(AdelegateMethod:...)が呼ばれるだけ
としか言えない

304 :デフォルトの名無しさん:2012/06/14(木) 23:57:20.03
>>302
事前にA.delegate=selfしてる場合なんですけど、その時はAクラスのADelegateMethodの内容に書かれている内容→BクラスのAdelegateMethodに書かれている内容、という流れになるんですかね??

349 :デフォルトの名無しさん:2012/06/16(土) 05:13:41.84
クラスの実装においても, インスタンスヴァリアブルへの(バキューン!)は, イニシャライザを除いて,
インスタンスヴァリアブルに直接アクセスするのではなくアクセッサを介して行うべきだ,と聞いたのですが
インタフェースとインプリメンテーションでインスタンスヴァリアブルの挙動を変えたい場合,
ようするに外からはreadonlyにしたいけれども, クラス内ではreadwriteにしたいとき,どのようにすべきなのでしょうか?
インタフェースにはreadonlyで宣言し,実装ファイルではクラスエクステンションを用いて,
プロパティ宣言をreadwriteでオーバーロードしようとすると,
Property attribute in continuation class does not match the primary class
と怒られてしまうのです.

350 :デフォルトの名無しさん:2012/06/16(土) 05:37:08.38
>>349
インスタンス「変数」でいいよw

Hoge.h
@interface Hoge
@property (readonly) id hogeValue;
@end

Hoge.m
@interface Hoge ()
@property (readwrite) id hogeValue;
@end

@implementation Hoge
@synthesize hogeValue;
...
@end

で、別にエラーにならずに、ちゃんと機能するけど?



352 :デフォルトの名無しさん:2012/06/16(土) 06:21:32.30
>>350
ありがとうございます。
readwriteだけだと上手くいくんですね。
strong, readwrite, atomicだと警告が出ますが
readwriteだけでも強参照にはなるのでしょうか?

353 :デフォルトの名無しさん:2012/06/16(土) 09:12:54.31
>>352
readonly 以外の部分は同じじゃないとダメ

354 :デフォルトの名無しさん:2012/06/16(土) 15:51:20.56
>>353
ありがとうございます.
なぜか, readonlyの方だけstrongをつけていなかったのですが, 確かに, readonly/readwrite以外同じにしたら警告が消えました.
サブクラスの実装を, スーパークラスと同じ実装ファイル内に書いて, クラスエクステンションを使えば, 親クラスのプロパティを隠蔽しつつ, サブクラスからはアクセス出来るように出来るので, 便利ですね.
しかし, プロパティを介してアクセスを行うと,インスタンス変数にアクセスする度にアクセサメソッドの呼び出しの処理や, さらにatomicにしているといちいちロックの処理が挟まれ, 無駄な処理が多くなる気がするのですが皆さんどうされてますか?

355 :デフォルトの名無しさん:2012/06/16(土) 16:00:17.46
本当にそこがボトルネックになるならば直接アクセスにすればいいし、
なるかどうかわからないのであれば気にしなければいい

atomicはたいして意味がないから基本nonatomicでいい

357 :デフォルトの名無しさん:2012/06/16(土) 19:59:01.73
>>354
気になるなら直接インスタンス変数使えばいいんじゃないの
getterはatomicの時(スレッド間で同期が必要なもんとか)にしか利点が無いような
setterは利点あるし、わざわざインスタンス変数直接ってのをするほど使わないような

364 :デフォルトの名無しさん:2012/06/17(日) 06:40:36.95
>>355>>357
ありがとうございます
うーんバンバンdispatch_asyncしてるのでatomicの方が安全かなと思うのですが難しい所ですね
atomicにしてても, インクリメント等するときや複数のプロパティをまとめてゲットしなきゃいけないときはさらに外側で@synchronizedしないといけなかったりするので
@synchronizedばっかりになってオーバーヘッドになりそうな気も

368 :デフォルトの名無しさん:2012/06/17(日) 18:22:09.87
スレッドプールとかGCDとかで複数のスレッドを使うようにするのは、
そのまま複数のCPUコアを均等に無駄なく使う事に繋がるのでは。

371 :デフォルトの名無しさん:2012/06/17(日) 23:55:29.52
>>368
そういうレベルの話じゃない。

ただ単にマルチスレッドな話だと、スレッドセーフにするために「ロック」や「セマフォ」を使いましょう。
といった内容になるだろう。

平行処理の方は、複数のCPUコアを同時に動かすことでパフォーマンスを稼いでいるので、
「ロック」や「セマフォ」などでスレッドを一時停止させては意味がない。
つまり、「ロック」や「セマフォ」を使わずに、スレッドセーフなプログラムを組む。
といった内容になります。

スレッドもCPUコアと同じ数しか作らないので、逆に言うとシングルCPUな環境だと無意味。
シングルCPUな環境なら、NSRunLoopを活用した方がよい。


378 :デフォルトの名無しさん:2012/06/18(月) 02:21:37.18
>>371
CPUで計算するだけなら並列処理にはマルチコア必要だけど、時間のかかるI/Oと
他の処理並行動作させたりするのもマルチスレッド化の大きな目的だから、
コア数どうこうは関係無いよ。排他制御の類は必ず必要だし、シングルコアだから
スレッド化不要とかロック多用して良いって事にもならない。
あと、単にカウンタ値増減したり、キューにデータ突っ込んだりとかは
atomic operationが用意されてるので(OSAtomicなんとか)これを上手く使えば
ロックの類は使わなくて済む。

411 :デフォルトの名無しさん:2012/06/20(水) 15:21:00.86
ARC=Auto Refarence Counting
自動で参照カウンタを操作する
自動で参照カウンタを
自動で
自動

426 :デフォルトの名無しさん:2012/06/20(水) 21:49:28.15
>>411,412,416
ありがとうございます。
ということは, 自動で変数を用意して代入してから引数として与えてしかる後に解放してくれるんでしょうか
単にretainやreleaseやautoreleaseを適切な場所に挟んでくれるだけだと思ってたので、
MRCだと挟めない書き方をするとダメだと思ってたんですが一時的に変数に移すのまで自動でやってくれるんですね・・・
- (NSString *)URLPathComponent1 {
return [[[[[self url] pathComponents] objectAtIndex:1] retain] autorelease];
}
↑これだと、この後メソッドから抜けるときに更にもう一度autoreleaseが掛かるはずなので、オーナーシップの数を超えてautoreleaseされると思うのですが大丈夫なんでしょうか?

484 :デフォルトの名無しさん:2012/06/30(土) 22:09:57.09
NSPredicateについて聞かせてください.
あるentityAから, 1:n対応でentityBと双方向のrelationshipがあるとき,
かつ, entityAに関連づけられたclassAのインスタンスaが既知のとき,
aとrelationshipを持つ, entityBに関連づけられたclassBのインスタンスb1, b2, ... bn全てをfetchするには,
NSPredicateじゃダメで, classBのインスタンスをどかっと全部fetchしてからプログラム上でaとrelationshipがあるものを抽出する...という形になるのでしょうか.

494 :デフォルトの名無しさん:2012/07/01(日) 00:20:04.31
>>484
CoreDataな話なんだよね?
インスタンスaに、インスタンスbへのrelationshipを表すNSSet型のプロパティbsがあるはずだよね?


504 :デフォルトの名無しさん:2012/07/01(日) 15:43:52.32
>>494-495
ありがとうございます。もちろん最初に書いたとおり、
全部オブジェクトとしてとってきてから、b.a(bからaへの対1参照)なり、a.bs(aからbへの対多参照)なりのプロパティで比較すれば出来るのですが、
コードをシンプルにするのとパフォーマンスを改善するためにNSPredicateで条件指定出来ればいいなと思いまして・・・

505 :デフォルトの名無しさん:2012/07/01(日) 23:29:14.28
>>504
> 全部オブジェクトとしてとってきてから、b.a(bからaへの対1参照)なり、a.bs(aからbへの対多参照)なりのプロパティで比較すれば出来るのですが、

ん??
要するに、EntityAに1:NでrelationshipしているEntityBを全て取得したい、ということなんだよね?

ClassA* a = fetchObject();
NSSet* bs = [a valueForKey:@"relationshipB"];

これで変数bsの中に、EntityAに1:NでrelationshipしているEntityBが全て入っていると思うのですが。


547 :デフォルトの名無しさん:2012/07/11(水) 00:35:47.36
LabelとTextFieldがあって、ボタンが押されたら
LabelにTextFieldの数値を加算するメソッドで
これをただ足すのではなく、数字がどんどん増えるようにしたいんだけど、
一気に増えちゃうのよね。どうすれば良い?

以下ソース
- (IBAction)addScore:(id)sender {
[self.view endEditing: YES];
NSInteger i;
NSInteger j;
i = [scoreText.text intValue];
j = [addScoreText.text intValue];
addScoreText.text = [NSString stringWithFormat:@""];
for (NSInteger l = 0; l <= j; l++) {
scoreText.text = [NSString stringWithFormat:@"%d",i + l];
}
}

627 :デフォルトの名無しさん:2012/07/22(日) 15:28:40.17
質問です。__weak修飾子について調べていたのですが、
下記の1回目のNSLog()をコメントアウトすると2回目のNSLog()で
aにnilが代入されているのですが、これはなぜでしょうか?
NSLog()がaを保持するのでしょうか?

__weak id a;
id b = [[NSObject alloc] init];
id c = [[NSObject alloc] init];

a = b;
NSLog(@"a:%p", a); // このNSLogをコメントアウトする次のNSLog()のaはnilが代入されている
b = c;
NSLog(@"a:%p", a);

665 :デフォルトの名無しさん:2012/07/31(火) 13:59:37.07
NSThreadで起動したスレッドの内部で、オブジェクトのbool型変数がFALSEに
なるまでwhile()ループする処理を入れています。
で、ループの直前でNSTimerでタイマを仕掛け、タイマ発火時にFALSEにする
ようにしましたが、ループが回っている間はタイマが発火しなく、無限ルー
プなってします。

ループの最後に[[NSRunLoop currentRunLoop] run];でメッセージを処理さ
せるようにすると指定時間でタイマが発火するのですが、runから処理が戻る
まで3秒以上かかってしまっていて、使えません。

Windowsですと、スレッド内でSetTimer()すると無限ループ中でもタイマ
イベントが発火するのですが、Macではどのようにしたらいいのでしょうか?


668 :デフォルトの名無しさん:2012/07/31(火) 14:41:28.39
>>665
>NSThreadで起動したスレッドの内部で、オブジェクトのbool型変数がFALSEに
>なるまでwhile()ループする処理を入れています。
出発点がそもそもおかしいと思うが。
普通はセマフォとかメッセージ待ちにするでしょ。

669 :デフォルトの名無しさん:2012/07/31(火) 14:50:52.21
行儀悪いけどこうやれば3秒後にループから抜けられるよ。

__block bool done = false;

dispatch_async(
 dispatch_get_global_queue(
  DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),
  ^{ sleep(3); done = true; });

while (!done) {}


670 :デフォルトの名無しさん:2012/07/31(火) 15:06:34.03
>>668
同期したいんじゃなくて、一定時間だけ処理させたかったんです。

>>669
結局、それに近い処理で実装してみました。
ループ前にNSDateで現在時間を取って、ループの最後でtimeIntervalSinceDate
で差を取得し、指定時間が経過していたらbreakするように。行儀悪いですが、
ひとまずは目的は果たせています。

スレッド内でのループ処理をタイマで抜けるようにする手法はないんでしょう
かね。


732 :デフォルトの名無しさん:2012/08/08(水) 18:38:10.65
プログラムの基本的なことかもしれませんが質問させてください

現在、iPhoneのアプリを作成中です。
同じような処理をほぼ同時に(少し時間差をつけて)3つに分けて処理させてようと思っています
処理の過程で他のクラスで「3つの内のどの処理を行うか」という判断のフラグ処理で悩んでいます

スマートなプログラム書きたいんですがフラグの参照方法がこれぐらいしか思いつきません。
・グローバル変数に設定する
・引数で渡していく
isRecordingのように何かの状態を見て判断させる手もありますが、状態変化で判断する所もなさそうです

他のクラスの中でデータの削除->保存->参照というのをやっていくのでどうしても
「3つの内のどの処理を行うか」という判断が必要になります

なにかいい方法があれば教えてくださいm(__)m


737 :デフォルトの名無しさん:2012/08/08(水) 19:04:06.94
質問してキーワード貰ったら最低でもググれよ

738 :デフォルトの名無しさん:2012/08/08(水) 19:11:04.35
>>732
> 説明がわかりにくくてすいません。。。
謝るまえに、もっと分かり易く説明してくれ。
何をしようとしているのか、いまいちよく分からないぞ。

で、これってマルチスレッドな話なのか?
スレッド1: 保存処理 -> 参照 -> 削除処理
スレッド2:  保存処理 -> 参照 -> 削除処理
スレッド2:   保存処理 -> 参照 -> 削除処理
こんな感じ?

それで、話に出て来る「他のクラス」って、いったいなんなの?
それから、ここでいう「データ」って何?


739 :732:2012/08/08(水) 19:23:12.62
>>737
一応ググったんですが普通にフラッシュの光らせ方しか出てこなかったもんで・・・
ソースコードも見てみましたけど、フラグに使えるんでしょうか?

>>738
ご指摘の通りマルチスレッドを使った1->2->3という処理です
「他のクラス」はマルチスレッドをスタートさせるところ以外のクラスです
「データ」は画像データです



740 :デフォルトの名無しさん:2012/08/08(水) 19:34:55.82
>>739
じゃあ、処理を3つに分けることと、フラグとの関係は?

@implementation OtherClass

- (void)threadProcess:(NSImage*)image
{
[self save:image];
[self reference:image];
[self delete:image];
}

@end

これじゃ、ダメなの?


741 :732:2012/08/08(水) 19:40:47.99
>>740
まぁ、それが引数で値を渡すっていう形になりますよね。
その先で色々と処理をしてて、ずっとその引数を渡していくというのが
ちょっとややこしいもんで・・・。

755 :デフォルトの名無しさん:2012/08/09(木) 17:35:25.59
NSThreadはオワコン

757 :デフォルトの名無しさん:2012/08/09(木) 18:43:10.66
>>755,756
ありがとうございます。他にスレッドを使用する方法があったなんて!
NSInvocationOperationとNSOperationQueueで実装しました。
NSInvocationOperation initWithTargetからnil以外が返ってきたら、
NSOperationQueue addOperationすればスレッドの起動が失敗することは
ないと考えてよいですか?

因みに、オワコンの意味を調べたのは内緒です。


759 :デフォルトの名無しさん:2012/08/09(木) 20:56:50.87
>>757
> NSOperationQueue addOperationすればスレッドの起動が失敗することは
> ないと考えてよいですか?

NSOperationQueueは、スレッドと1対1で対応している訳ではないので、それは不明。

あと、あるスレッドでエラーが発生すると、スレッドが落ちることもある。
つまり、スレッドが起動成功しても直後にエラー落ちする可能性もある。

根本的に別の手段を考えた方がいいのでは?

760 :デフォルトの名無しさん:2012/08/09(木) 21:40:43.07
>>757
NSOperationQueue は同時に起動するスレッド(NSOperation)数はコア数に制限されているから、
スレッドの起動に失敗するということは全くといっていいほど考えられないのじゃないかなあ

761 :デフォルトの名無しさん:2012/08/09(木) 22:19:02.63
>>760
ん?
スレッド数に制限があることと、スレッドの起動に失敗しないこととの間に、いったいどんな関係が?

762 :デフォルトの名無しさん:2012/08/09(木) 22:21:17.62
>>761
スレッドの起動に失敗するのって逆にどういうの?リソースが足りないぐらいしか思いつかないんだけど

777 :デフォルトの名無しさん:2012/08/10(金) 10:00:28.27
754です。
スレッド起動に関する議論、参考になります。
スレッドが動き出せたのかどうかを知るのって、重要だとおもうんですよ。
議論を読んでいると、NSOperationQueueですら確実に実行できているとは
限らないと読めるんですが、皆さんがスレッド使うプログラムを作るとき
は、結局どう判定してるの?動くこと前提にしちゃうんでしょうか。

>>759
>根本的に別の手段を考えた方がいいのでは?

ということで、オワコンと言われているNSThreadに戻ってきました。
NSThread initWithTargetで、nil以外が受け取れたならばスレッドは起動
出来ると判断して、NSThread startを呼ぶようにしました。
こんな感じですが、どうでしょうか。

NSThread* th = nil;
th = [[NSThread alloc]initWithTarget:self selector:@selector(threadFunc) object:nil];
if(th)
[th start];
else
return false; // エラー



http://toro.2ch.net/test/read.cgi/tech/1330330906/l50/../人気ブログランキングへ