[表示 : 全て 最新50 1-99 101- 201- 301- 401- 2chのread.cgiへ]
Update time : 05/23 12:40 / Filesize : 139 KB / Number-of Response : 483
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Cocoaはさっぱり!!! version.13



1 名前:名称未設定 mailto:sage [2009/05/04(月) 12:25:25 ID:uDYhVLXL0]
■前スレ
Cocoaはさっぱり!!! version.12
pc11.2ch.net/test/read.cgi/mac/1231853172/

■関連スレ
Macでプログラミング{9}
pc11.2ch.net/test/read.cgi/mac/1216824430/
MacOS XをUnixとして使ってる人の為のスレ その14
pc11.2ch.net/test/read.cgi/mac/1216715423/
Xcode part7
pc11.2ch.net/test/read.cgi/mac/1218774554/
MacでJava その4
pc11.2ch.net/test/read.cgi/mac/1214284891/
RubyCocoa 初心者質問【Leopardバンドル記念】
pc11.2ch.net/test/read.cgi/mac/1193373811/
AppleScript アップルスクリプト 質問、発表 3
pc11.2ch.net/test/read.cgi/mac/1223026902/
iPod touch/iPhone ネイティブアプリ製作 ver.10
pc11.2ch.net/test/read.cgi/mac/1238385226/
Objective-C [ObjC part:4];
pc12.2ch.net/test/read.cgi/tech/1239721860/

152 名前:名称未設定 mailto:sage [2009/05/26(火) 17:22:23 ID:Q2hth1EJ0]
Release用ビルド設定のPreprosessor MacrosにNDEBUGを設定して

#ifndef NDEBUG
NSLog(@"Debug Mode");
#endif

でいけるとおも。

153 名前:名称未設定 mailto:sage [2009/05/26(火) 18:52:52 ID:lNXmn4af0]
>>152
NDEBUGというマクロ名は意図的に選んでるの?

154 名前:名称未設定 mailto:sage [2009/05/26(火) 18:59:40 ID:ANgsl3SV0]
assert.h 関係ですね

155 名前:名称未設定 mailto:sage [2009/05/26(火) 20:09:00 ID:Q2hth1EJ0]
>>153

>>154さんご指摘の通りです。
自前で用意してもいいんですが、慣例的に利用されているようなので
特に理由がない限りNDEBUGマクロ使ってます。

Cocoaネタで言うと、NSAssert[1-5]()なんかは
NS_BLOCK_ASSERTIONSって独自のマクロ定義してますね。

以下補足です。
ログ程度で毎回 #ifndef NDEBUG ... #endif は面倒なので

/* MyDebug.h */
#ifndef NDEBUG
 #define MyLog(fmt, ...) NSLog(fmt, __VA_ARGS__)
#else
 #define MyLog(fmt, ...)
#endif

なんてのがよく使われてるみたいです。
ちなみに__VA_ARGS__は、C99の機能なので
ビルド設定の変更もお忘れなく。

長文失礼。


156 名前:名称未設定 mailto:sage [2009/05/26(火) 20:13:50 ID:8gfXRQlR0]
>>152
あとは
#ifndef NDEBUG
#define NSLog(...)
#endif
でNSLog()自体無効にするとか。


157 名前:151 mailto:sage [2009/05/26(火) 21:07:20 ID:Hh/s6JXoP]
>>152
>>155-156
やってみたところうまく切り分けて動作しました。
ありがとうございました。
NSLog自体を無効にするというのも面白いですね。今まで残していたものも全てユーザに見せないようにできるという楽でいい方法だと思いました。



158 名前:名称未設定 mailto:sage [2009/05/27(水) 08:12:40 ID:5crTst2N0]
>>157
重要な NSLog は残しておくのも吉だとおもう
フリーウェア書いてるが、それのおかげでバグがあったときに
ユーザーさんから log file を送ってもらって
バグが究明出来たことが何回かあるし。

Apple 製のソフトだって大量にコンソールにログをだしてるから
ぼくらも多少ログを吐いてもいいんじゃないかと。

159 名前:名称未設定 mailto:sage [2009/05/27(水) 13:30:26 ID:rQRiXzwK0]
重要な物ならいいけど、ディスクアクセスが発生するので出来るだけ避けて欲しい。

「なんかもっさりだな」って思ったら毎秒ぐらいのペースでログが出てて、連続
ディスクアクセスのパフォーマンスが落ちてたとかある。

まあ、かな漢字変換のディスクアクセスがそんな感じなんだが、、、


160 名前:151 mailto:sage [2009/05/27(水) 20:18:45 ID:coL084HnP]
なるほど確かに重要な情報は残しておきたいし、ディスクアクセスの妨げになるような出力も避けるべきですね。
勉強になりました。



161 名前:名称未設定 mailto:sage [2009/05/27(水) 20:23:41 ID:DNUe0f2p0]
Preview.app なんかがやっているのですが、
オープンしたファイルが Finder やら mv などでリネームされても
アプリがアクティブになったときにリネームをアプリが即座に知って
ファイル名表示を更新しているのです。
ファイルが別のディレクトリに移動されてからリネームしてもも同様にすぐ反映しています。

フルパスではない何かinodeのようなものか何かを保持しているのだと思うのですが、
これは Cocoa 的にはどのクラスやフレームワークを使えば実現できるのでしょうか。

また即座に通知されるのはキー値監視のようなことがファイルに対しても出来るのでしょうか。


162 名前:名称未設定 mailto:sage [2009/05/27(水) 21:10:08 ID:AJ4glpaE0]
>>161
それは確かCocoaだけでは実現できなかったと思います。
CFURLGetFSRefというCarbonの関数を使ってファイルへのエイリアスを取得し、
それをまた実パスに戻したりとかちょっと手間のかかる事をやります

163 名前:名称未設定 mailto:sage [2009/05/27(水) 22:03:43 ID:DNUe0f2p0]
>>162
ありがとうございました。
CFURLGetFSRef 周りの Carbon の関数やFSRefなどを調べてそのような処理を書いてみます。
(すみません、Cocoaではスレ違いだったのですね。)


164 名前:名称未設定 mailto:sage [2009/05/27(水) 22:18:18 ID:AJ4glpaE0]
>>163
Cocoaのメソッドだけでこなせない時にCarbonのコードを内包するのは
よくやられる手法で、まんざらスレ違いというわけでもなかったり(笑)
できればそろそろNSFileManagerあたりがサポートしてくれるとありがたいな〜と
(もしかすると既にあったりして...)

165 名前:名称未設定 mailto:sage [2009/05/27(水) 22:28:36 ID:BSyot79b0]
>>163
NDAlias等のラッパーを利用するのが、簡単でしょう。



166 名前:名称未設定 mailto:sage [2009/05/31(日) 09:34:37 ID:LG4aWmHm0]
WebViewでRealAudioのファイルを再生したいのですが
同じHTMLソースをsafariでは正常に再生できるのに
自分で作っているものではRealAudioのプラグインは表示される
ものの再生ボタン等がディスエーブルになってしまって再生できません
WebPreferencesのarePlugInsEnabledはYESを返してくるのですが
他に何か設定を変えなければならないんでしょうか?

167 名前:163 mailto:sage [2009/06/01(月) 16:25:01 ID:I59S1qHp0]
>>164
確かに狭義の Cocoa スレってわけにはいかないですね。
すっかり忘れていましたが昔 ProcessSerialNumber のためだけに Carbon フレームワークを追加したことがありました。

>>165
これはすばらしいですね。NSCoding などにも準拠していて Core Data にもすぐ使えて便利そうです。
即座にプロパティを NSAlias に変更しました。
ありがとうございました。
((BOOL)setPath: は (void)setPath: じゃなきゃ KVC (?)に対応じゃないよとランタイム(?)から NSLog が出たりしましたがそこは書き換えればすみました)

168 名前:名称未設定 mailto:sage [2009/06/01(月) 20:36:17 ID:z40AA1IZ0]
>>167
165です。
NDAliasを書き換える必要はないでしょう。
たとえば、
- (NSString *)path
{
[self willAccessValueForKey:@"path"];
return [[self alias] path];
[self didAccessValueForKey:@"path"];
}

- (void)setPath:(NSString *)newPath
{
[self willChangeValueForKey:@"path"];
[self setAlias:[NDAlias aliasWithPath:newPath]];
[self didChangeValueForKey:@"path"];
[qtmovie release];
qtmovie = nil;
imageVersion++;
}
とすれば良いのです。Pathを短時間に大量に、あるいは何度も変更しない限りperformanceに
悪影響はないと思います。

他のアプリでの変更を反映させるには、適当なNotification(NSApplicationDidBecomeActiveNotification,
NSWindowDidBecomeMainNotification etc)を受けて、path valueにアクセスすれば良いでしょう。
[object path], [objects valueForKey:@"path"]



169 名前:163 mailto:sage [2009/06/01(月) 22:49:24 ID:mB7SOtSF0]
>>168
なるほど NSManagedObject のサブクラスを作って (void)な setPath: などを実装すればいいのですね。
今は NSManagedObject の value に気楽に NDAlias を放り込んでおりました。
みなさんは逆に気楽に NSManagedObject のサブクラスを作ってらっしゃるんですね。

# というかなんで quicktime movie ってバレてるんですかwwwww

確かに Preview.app はアクティブになったときにファイル名の変更に気づいているので
その nonitifcation で処理しているんでしょうね。ありがとうございました。

170 名前:名称未設定 mailto:sage [2009/06/01(月) 23:22:29 ID:3BCoBALr0]
>>167
クラス名をNSAliasにしちゃダメでしょ
一般的には接頭語にNSは使わない方が良いだろうし、実は_NSAliasっていうプライベートクラスが既にあるし



171 名前:名称未設定 mailto:sage [2009/06/01(月) 23:23:35 ID:ibtFloOf0]
>>170
いや、NDAlias というつかいよいクラスがあるんですよ

172 名前:名称未設定 mailto:sage [2009/06/01(月) 23:29:27 ID:3BCoBALr0]
>>171
だからクラス名はNDAliasのままで、NSAliasにしちゃダメでしょってこと

と思ったけど、>>167良く見るとクラス名じゃなくてプロパティの名前かーじゃあ別にいいか

173 名前:163 mailto:sage [2009/06/01(月) 23:35:38 ID:mB7SOtSF0]
>>170
書き間違えました。手がNEXTSTEPになれきってしまっているようで^^;汗
プロパティの一つにクラス NDAlias を使ったということです。
プロパティの名前は alias です。
インスタンス名やプロパティの名前は小文字で始めるのが NeXT からの習わしですよね

174 名前:名称未設定 mailto:sage [2009/06/01(月) 23:40:24 ID:3BCoBALr0]
>>173
誤字でしたか、スマソ

175 名前:名称未設定 mailto:sage [2009/06/02(火) 21:37:22 ID:oUUbzT8a0]
>>169
168です。
managedObjectのsubclassを作らないのなら、KVC, KVO コンプライアントなアクセッサを
NDAliasのカテゴリーで追加すれば良いです。
例えば、hoge, setHogeを実装すればkeyPath @"alias.hoge"でアクセスできます。
もちろん、コンフリクトしないネーミングが重要です。

NDAliasのコードを改変するのは、下策でしょう。

># というかなんで quicktime movie ってバレてるんですかwwwww
テストプロジェクトのコードをコピペしただけです。
偶然の一致とはいえ、面白いものですね。
私は千里眼ではないので、、(笑)

バグがあったので訂正します。
- (NSString *)path{
[self willAccessValueForKey:@"path"];
NSString *value = [[self alias] path];
[self didAccessValueForKey:@"path"];

return value;
}


176 名前:163 mailto:sage [2009/06/04(木) 11:45:21 ID:STpJekAS0]
>>175
お恥ずかしい限りですが、目から鱗でした!
NDAlias 自体に手を付けずに category で追加できるのが Objective-C の真骨頂でしたね。
知識として category という概念があるというぐらいではなく、
このように使いこなしていきたいと思った次第です。

そこで早速categoryを作ってアクセサを追加してみたところ、見事に警告なく動作致しました。
ありがとうございました。

今回のこの警告でそれ以外に勉強になったことをチラシの裏に書いてみますと、
category で追加前は、alias.path を editable ではない TextField にバインディングしており、
コードでは setPath: しているところはないにも関わらず、
setPath: についての警告がバインディングから(ランタイムのとこかから?)
コンソールに出力されるということでした。
バインディングした時点で、editable に関わらず、
KVO に準拠しているかどうかが(ランタイムに?)チェックされるのですね。

177 名前:名称未設定 mailto:sage [2009/06/04(木) 16:13:44 ID:FN7ww8Hm0]
純正アプリ(例えばiTunes)のLocalizable.stringは
"137.006" = "ダウンロード中 (^1 / ^2)";
というように表記されていますが、
^1 これはどのようにコードから呼び出せばいいのでしょうか?
%@ならstringWithFormat:を使えばいいのですが。

178 名前:名称未設定 mailto:sage [2009/06/04(木) 16:25:17 ID:STpJekAS0]
NSMutableString の replaceOccurrencesOfString:withString:options:range: を使えばよいような気がします。
%@ はむしろ危険な香りがします。なんとなく。

179 名前:名称未設定 mailto:sage [2009/06/04(木) 17:21:08 ID:X5X6UBZT0]
%@の話はもうたくさん

180 名前:名称未設定 mailto:sage [2009/06/04(木) 18:08:38 ID:FN7ww8Hm0]
>>178




181 名前:名称未設定 mailto:sage [2009/06/04(木) 18:36:00 ID:FN7ww8Hm0]
>>178
コードで検証してみました。
NSMutableString *mString = [NSMutableString stringWithstring:NSLocalizedString(@"137.006", nil)];
[mString replaceOccurrencesOfString:@"^1" withString:@"hoge" options:0 range:NSMakeRange(0, [mString length])];
[mString replaceOccurrencesOfString:@"^2" withString:@"huga" options:0 range:NSMakeRange(0, [mString length])];

これでうまくいったのですが、ちょっとローカライズ文字列を取り出すのにこれは面倒ですね、、。
純正アプリもこのようにしているのでしょうか。
このようにNSMutableStringと^1を用いてローカライズ文字列を取り出す場合の利点はどういった所でしょうか?

182 名前:名称未設定 mailto:sage [2009/06/04(木) 18:59:47 ID:CEgw24940]
iTunesはCarbonアプリだよ。
その^1とかいうのも、旧Mac OS時代のテキストリソースの書式。

183 名前:名称未設定 mailto:sage [2009/06/04(木) 19:47:39 ID:7RDrGgVy0]
>>181
ParamText()っていう古いAPIの手法だよ。^nがn番目の引数に置き換わる。
当然そんな面倒臭い呼び出し方はせず、wrapper作って1 stepで呼び出してるはず。
%@方式に比べて順番が指定できるから、日本語と英語みたいに逆順表現になる場合は有効
"%@ %@"だと引数入れ替える必要あるけど、^n方式だと"^1 ^2"を"^2 ^1"にすればOK

184 名前:名称未設定 mailto:sage [2009/06/04(木) 20:14:49 ID:CEgw24940]
Formatted Stringでも順番指定は出来るでしょ。
%1$@, %2$@, ...のように。

185 名前:名称未設定 mailto:sage [2009/06/04(木) 20:51:59 ID:oneyXL090]
何と、そんな書式があったとは

186 名前:177 mailto:sage [2009/06/04(木) 21:12:11 ID:+hNFS8n90]
>>182 >>183
なるほど!謎が解けました。CarbonのAPIを利用していたとは考えつきませんでした。
ありがとうございます。

187 名前:名称未設定 mailto:sage [2009/06/04(木) 21:24:06 ID:CEgw24940]
>>184に加えて念のため書いておくと、「%@」に限った話ではない。printfの書式知ってる人には当たり前だけど。
developer.apple.com/documentation/Cocoa/Conceptual/Strings/Articles/formatSpecifiers.html

188 名前:名称未設定 mailto:sage [2009/06/04(木) 21:58:26 ID:AlxKaiKB0]
>>176
168です。動作おめでとうございます。
サブクラスでなくカテゴリを使うとコードやIBでの変更が少なくてすみます。
私も
Using Tree Controllers With NSXML Objects
developer.apple.com/documentation/Cocoa/Conceptual/NSXML_Concepts/Articles/UsingTreeControllers.html
を読んだときは感動しました。

後半のtextFieldの件はconditionally sets editableがオンになっていたのではないでしょうか?

161で書かれている機能はdocument based applicationでは、かなり前から実装されています。
cocoaで、document baseではないapplicationでもこういった機能が使えるようなAPIが公開されることを
願っています。


189 名前:163 mailto:sage [2009/06/06(土) 15:23:22 ID:8Hv1u8j90]
なるほどこのような XML に関するいいドキュメントを教えて頂きありがとうございます。
Apple 自ら NS* なクラスを拡張する記事を書いてくるとは勉強になりますね。
Apple だから NS* なクラスそのものにメソッドを追加する仕様変更もできるのに
デベロッパ側でも自由にできる柔軟な言語であることを公式記事として紹介する姿勢がまたよいなあと思いました。

conditionally sets editabe はオフのままでした。
(試しに alias.path に戻して試してみました)
やはり binding した時点で KVO 準拠かどうかはランタイムか誰かがチェックするようになっているんですかねえ。

document-based application では実装されているとは知りませんでした。
(まだ document-based なのは一度も使ったことないのですあせあせ)
ならば将来は Cocoa でそういう API が公開されるかもしれませんね。


190 名前:名称未設定 mailto:sage [2009/06/07(日) 20:51:32 ID:wcoqoclb0]
>>189
188です。
release noteとか、sample code、ヘッダファイルのコメントに有用な情報があることもあります。
GuideやOverViewとかの解説記事は更新が結構遅れることがあります。

textFieldの件、実験しました。
read only bindingの場合、-set<Key>:が無くても警告が出ませんが、KVCコンプライアントでない-set<Key>:
があると警告が出るようですね。
一つ勉強になりました。




191 名前:名称未設定 mailto:sage [2009/06/08(月) 00:33:41 ID:cWdbvugm0]
オブジェクトを動的に判別する
カッコイイサンプルコードを教えてください

192 名前:名称未設定 mailto:sage [2009/06/08(月) 01:08:36 ID:DQN4aVj/0]
>>191
[obj class]
[obj isKindOfClass: ]
ぐらいつかっておけ

193 名前:名称未設定 mailto:sage [2009/06/08(月) 01:26:55 ID:cAuoxGAE0]
>>192
isMemberOfClass:もねDQNさん

194 名前:名称未設定 mailto:sage [2009/06/08(月) 06:08:21 ID:JFdwuF9a0]
>>193
クラスを判別したいとは書かれてないのになんでそうなるの?牛野郎




おれのIDは何になるか・・ドキドキだぜ!

195 名前:名称未設定 mailto:sage [2009/06/08(月) 09:52:34 ID:hb99arLO0]
>>192
DQNwww

196 名前:名称未設定 mailto:sage [2009/06/08(月) 11:52:32 ID:DQN4aVj/0]
>>195
どうも、ご愛顧いただいております DQN です

197 名前:名称未設定 mailto:sage [2009/06/09(火) 12:00:17 ID:/N8YFhoo0]
アプリケーションの起動時に、あるクラスのインスタンスをNSNotificationSenterに登録しようと思っています。

+ (void)load {
[[NSNotificationCenter defaultCenter]
addObserver:[[[self alloc] init] autorelease]
selector:@selector(hoge:)
name:@"fuga"
object:nil];
}

このようにするのは安全ですか?
+load の中で そのクラスの -init を呼んでも大丈夫なのでしょうか。

198 名前:名称未設定 mailto:sage [2009/06/09(火) 13:17:03 ID:SaDTu/q00]
www.mikeash.com/?page=pyblog/friday-qa-2009-05-22-objective-c-class-loading-and-initialization.html
によると、+load は早すぎ。
+initialize はそのクラスの他のメソッドを呼ぶ寸前にならないと呼ばれないので
Notification を登録するには遅いかも。

というわけで僕の技量ではわかりません(;_;)
ぼくなら諦めてメインの awakeFromNib から登録します...
なにかいい方法わかったら教えてください

199 名前:名称未設定 mailto:sage [2009/06/09(火) 13:32:33 ID:HGRM8OPL0]
NSApplicationのdelegateメソッド
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification

あるクラスがいつロードされるのか
NSApplicationのdelegateがあるクラスを知ってるのか
は知らんけど、大体ここで。

200 名前:197 mailto:sage [2009/06/09(火) 15:48:46 ID:EeY5aCI70]
>>198-199
ありがとうございます。
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
を使う事にします。

-awakeFromNib を使うにせよ、どこかのメソッドで一括して登録するしかなさそうですね。
上記の +load を持つクラスを継承してXXXOberver, YYYObeserver, ... を作れば、
それらを個別に登録する手間が省けるかと思ったのですが。



201 名前:名称未設定 mailto:sage [2009/06/09(火) 15:54:10 ID:r/0i+jR00]
イニシャライザではダメなの?

202 名前:名称未設定 mailto:sage [2009/06/09(火) 16:05:22 ID:HGRM8OPL0]
要望は「アプリケーションの起動時に」ですから。

203 名前:名称未設定 mailto:sage [2009/06/09(火) 16:23:48 ID:03wOq/G50]
インスタンスを登録するんだから、インスタンスの初期化時で良いんじゃない?
そもそも起動直後にインスタンスが存在してる保証があるのかも分からんし。

204 名前:名称未設定 mailto:sage [2009/06/09(火) 16:38:54 ID:IaPDkHQu0]
>>200
NSValueTransformerを登録するのに+loadを使っています。
同じ手法が適応できるかですね。
197の場合、NSNotificationCenterのsingletonが作られるのでしょうか?
一度実験してみたらよいのでは?
ただ、+loadでautoreleaseを使うのならNSAutoreleasePoolのインスタンスが必要です。


205 名前:名称未設定 mailto:sage [2009/06/09(火) 16:58:49 ID:HGRM8OPL0]
対象オブジェクトをnilにしてるってことはあるNotificationをすべて受けたいってことでしょ?
そういう場合は起動時にオブザーバーの作成とNotificationCenterへの登録を同時にしたいってのは普通の要望でしょう。
って、ことだろうなって思ったんだけど。

206 名前:197 mailto:sage [2009/06/09(火) 17:18:37 ID:EeY5aCI70]
>>201, >>203
必要なインスタンスはobserverに登録するもの1つだけなので、
初期化時に登録するというのは本末転倒な気がします。

>>204
>197の場合、NSNotificationCenterのsingletonが作られるのでしょうか?
+load が呼ばれるのは依存しているフレームワークのクラスすべての +load が呼ばれた後、とのことなので、
おそらくsingletonは正常に作られると思います。後ほど実験してみます。

>+loadでautoreleaseを使うのならNSAutoreleasePoolのインスタンスが必要です。
なるほど、 +load の時点ではプールは存在しないのですね。
登録したインスタンスはアプリケーション終了時まで削除しないので、
autoreleaseは使わない事にします。

207 名前:名称未設定 mailto:sage [2009/06/09(火) 17:23:06 ID:03wOq/G50]
やろうとしてる事のメリットが全く分からないんだけど。
なぜinitで登録するのがダメなのか教えて欲しい。

208 名前:名称未設定 mailto:sage [2009/06/09(火) 17:25:58 ID:03wOq/G50]
>>206
>必要なインスタンスはobserverに登録するもの1つだけなので、
>初期化時に登録するというのは本末転倒な気がします。

要するに複数のインスタンスは作りたいけど、Notificationに対する動作は1回にしたい、という事か。
それだと設計に問題があると思うが。
コントローラーを1つ作って、それに処理させるのが普通じゃね?

209 名前:名称未設定 mailto:sage [2009/06/09(火) 17:52:44 ID:rt8PJHXF0]
>>200
>> 上記の +load を持つクラスを継承してXXXOberver, YYYObeserver, ... を作れば、
>>それらを個別に登録する手間が省けるかと思ったのですが。
こういうのは後で見たときにオブザーバが起動時に登録されてることが隠蔽されちゃって
わからなくなるからちゃんと明示的に登録した方がいいと思うよ。
それと再利用について問題が発生しないならシングルトンクラスはなるべくサブクラス
せずに一つですませるのがいいと思う。
ぼくならいわゆるApplication Controller クラスで全部やっちゃうな。

210 名前:197 mailto:sage [2009/06/09(火) 17:53:00 ID:EeY5aCI70]
>>207-208
他の手法がダメというわけではありません。
+ (void)addObservers {
[center addObserver:[[XXXObserver alloc] init] ...];
[center addObserver:[[YYYObserver alloc] init] ...];
[center addObserver:[[ZZZObserver alloc] init] ...];
}
などのメソッドを作り一括で登録してもよいのですが、
このような***Observerクラスの実装を頻繁に追加するつもりだったので、
その度に+addObserversを書き換えたり、登録に漏れがないかチェックしたりする労を避けたかったのです。





211 名前:197 mailto:sage [2009/06/09(火) 18:01:59 ID:EeY5aCI70]
>>209
>こういうのは後で見たときにオブザーバが起動時に登録されてることが隠蔽されちゃって
>わからなくなるからちゃんと明示的に登録した方がいいと思うよ。
グループ名やファイル名、クラス名を工夫して分かりやすくしようと思っていましたが、
確かにトリッキーなことをしていると後々分からなくなりそうですね。

212 名前:名称未設定 mailto:sage [2009/06/09(火) 18:28:39 ID:03wOq/G50]
>>210
そうじゃなくてXXXObserverとかYYYObserverのinitの中でNotificationの登録をすればいいじゃん、て話。

213 名前:197 mailto:sage [2009/06/09(火) 18:36:57 ID:/N8YFhoo0]
連投失礼します。簡単に実験してみたところ、正常に動作しているようでした。
少なくとも、+ loadの中で自分自身やCocoaクラスのインスタンスを作成することは問題ないようです。

設計方針には誤りがあるようなので、再検討してみます。ご指摘ありがとうございました。

214 名前:197 mailto:sage [2009/06/09(火) 18:48:18 ID:/N8YFhoo0]
>>212
語弊があったかもしれませんが、observerとして登録するインスタンス以外に、
XXXObserverのインスタンスを作ったり参照したりすることはありません。

もしinitの中で登録するのであれば
+ (void)addObservers {
[[XXXObserver alloc] init]; // initの中でNotificationの登録
}
こんな書き方になるでしょうが、>>210と本質的な違いがあるとは思えません。

215 名前:名称未設定 mailto:sage [2009/06/09(火) 20:24:27 ID:WjMp2AGZ0]
つまり、XXXObserverみたいのがたくさんあって、追加変更されることもある
だからapplicationDidFinishLaunchingで 手動登録するとミスがでやすい
そこで、XXXObserverクラスが読み込まれたときに自分自身でオブザーバ登録するようにすれば
ファイルをプロジェクトに登録しただけでok で良くなる

ということだよね

216 名前:名称未設定 mailto:sage [2009/06/10(水) 03:00:35 ID:oybbK05z0]
おれも>>212でいいと思うんだけど

217 名前:名称未設定 mailto:sage [2009/06/10(水) 06:15:54 ID:HWaH6z3b0]
見張りたいイベントの種類ごとにオブザーバクラスを作るよりは、アプリケーション全体の
コントローラクラスに通知を処理するコードをまとめた方がいいと思う。
コードを別々のオブザーバクラス達に切り分けるとオブジェクト指向っぽく見えるかもしれないけど、
実際のところ
1) オブザーバオブジェクトの登録は通知の種類ごとに別々に書かなければならず、メソッド継承の
メリットがない。
2) オブザーバクラスはそれ自体が固有のデータなり外部の対象を表しているわけでなく、たんに特定の
処理をまとめているだけなので、別クラスにするオブジェクト指向的な必然性がない。
3) ソースファイルレベルで整理したければ別カテゴリに分けておけばいい。
4) オブザーバクラスの初期化メソッドに登録処理を入れてしまうと後で流れがわかりにくくなる。
という事情があるのであまりオブザーバクラスを作るメリットがないように思う。こういうのはもしSmalltalk
だったらブロック構文で通知処理コードを書いちゃうところじゃないかな。だからメインのコントローラクラスに
いろいろ個別の処理のためのメソッドをいろいろ作るのがそれほどダサイことだとも思わない。

218 名前:名称未設定 mailto:sage [2009/06/10(水) 06:46:31 ID:C43i09fd0]
そもそもコントローラーを正しく設計していれば
Notificationを使う必要性はあまり無いと思うけど。

219 名前:名称未設定 mailto:sage [2009/06/14(日) 21:08:41 ID:XPyIS2i/0]
情報が無くて・・・ご存知でしたら教えてください。

Cocoaプラグインは、64bit化してもアンロードサポートがないまま
なのでしょうか?
CocoaバンドルサポートはCoreFoundationバンドルサポートより
この点で致命的に使いづらいです。

CFPlugin使いづらいよ・・・

220 名前:名称未設定 mailto:sage [2009/06/15(月) 00:38:34 ID:qX+5qPVB0]
>>219
ええっと、Leopard になって NSBundle も unload できるようになったんですが。
32bit でも 64 bit でもですよ。
NSBundle Class Reference 読みましたか?
情報無いって言うまえに本家のドキュメントを読んでください。
developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSBundle_Class/Reference/Reference.html#//apple_ref/occ/instm/NSBundle/unload



221 名前:名称未設定 mailto:sage [2009/06/15(月) 05:42:32 ID:7movYKEj0]
うわぁ・・・ホントですね失礼しました。

Bundle Programming Guideのほうは

You cannot currently unload the contents of an NSBundle object.
You can unload the contents of a CFBundle object using CFBundleUnloadExecutable. If your bundle may be unloaded,
you need to ensure that string constants are handled correctly
by setting an appropriate compiler flag.

って書いてあったので、未だに出来ないものだとばかり・・・


222 名前:名称未設定 mailto:sage [2009/06/15(月) 10:12:39 ID:qX+5qPVB0]
>>221
いえいえ。一般に Apple のドキュメントは、
ヘッダファイル内のコメント , Tech notes
>> Release Notes
>> 各クラスのドキュメント
>> 何とかかんとかガイド
>> 日本語訳
の順に情報が新しいので、下のほうにいくほど情報が古いことがよくあります。

223 名前:名称未設定 mailto:sage [2009/06/15(月) 15:58:12 ID:OLaEf2q/0]
質問です。Appleイベントを拾う場合に、

NSAppleEventManager *aeMgr = [NSAppleEventManager sharedAppleEventManager];
[aeMgr setEventHandler : self
andSelector : @selector(handleGetURLEvent:withReplyEvent:)
forEventClass : kInternetEventClass
andEventID : kAEGetURL];

と例があるのですが、kInternetEventClassとkAEGetURLはcarbonの定数?みたいなのですが、
これは将来使えなくなるのでしょうか?

よろしくお願いします。



224 名前:名称未設定 mailto:sage [2009/06/15(月) 16:34:01 ID:Y372xsMm0]
kInternetEventClass、kAEGetURLという名前が変わることがあっても、
実体は変わらないはずです。

無くなるのはAppleEvent自体がなくなるときだと思うよ
無くなるのだとしても十分な期間を置くでしょ

225 名前:名称未設定 mailto:sage [2009/06/15(月) 23:37:14 ID:qX+5qPVB0]
>>223
別に Carbon が全部使えなくなるわけではないです。
Leopard が出る際に公表された今後の方針は、
64bit ソフトでは Carbon の GUI まわり (HIToolBox とか) は
使えませんというだけで、GUI より下のレベルの
OS の基本にかかわってくるのは大丈夫なはずです。
というかドキュメントを読むと、64bit で使える、使えない、
と書いてるので自分で確かめられます。

226 名前:名称未設定 mailto:sage [2009/06/16(火) 00:16:09 ID:AQ67C4GH0]
AppleEventなくなったら何もできなくなるじゃん
代替のものが登場してさらにそれが十分に浸透しない限りAEはなくならない

227 名前:名称未設定 mailto:sage [2009/06/16(火) 00:18:34 ID:NJ+CxxYH0]
もしかしたら基本的な質問かもしれませんが、
10.5で追加されたクラスを使いつつ10.4に対応させるにはどうしたら良いでしょうか?
10.5上で動作している場合は10.5で追加されたクラスを使い、
10.4上の場合は別のやり方で回避する、ということをしたいのですが、
10.5SDKを使っていると10.4で動かすことはできませんよね?
メソッドならperformSelectorとかを使えばなんとかなりますが
クラスの場合はどうすれば良いでしょうか?
ビルド設定とかでなんとかなるもんなんですか?

228 名前:名称未設定 mailto:sage [2009/06/16(火) 00:25:18 ID:AQ67C4GH0]
一番手っ取り早いのはNSClassFromString

229 名前:名称未設定 mailto:sage [2009/06/16(火) 05:57:09 ID:idbUOSgX0]
10.4と10.5に分けてリリースするのが普通だと思うが

230 名前:227 mailto:sage [2009/06/16(火) 10:01:44 ID:NJ+CxxYH0]
>>229
まあ本当はそうすべきなんでしょうが、10.5の新機能をがんがん使っているというわけでもないもので
できればシームレスに統合したいと思っています。

>>228
ありがとうございます。
NSClassFromStringとNSInvocationでなんとかしました



231 名前:名称未設定 mailto:sage [2009/06/16(火) 10:13:12 ID:g72K1aOw0]
>>230
Leopard専用のフレームワークにリンクしてる時点でTigerでは起動できないんじゃない?

232 名前:名称未設定 mailto:sage [2009/06/16(火) 10:34:18 ID:NJ+CxxYH0]
>>231
>Leopard専用のフレームワークにリンクしてる時点でTigerでは起動できないんじゃない?
Cocoaに新たに追加されたものを使っているだけで
新しいフレームワークを使っているわけではないです
それだったら10.4は切ります

233 名前:名称未設定 mailto:sage [2009/06/16(火) 11:04:43 ID:2ORR5FIV0]
weak linkとかそういう次元の話?
Cocoaでどうやるのかはシラネ。

234 名前:名称未設定 mailto:sage [2009/06/16(火) 11:12:19 ID:AQ67C4GH0]
>>233
普通に/System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoaにリンクしとけばいいだけっしょ

235 名前:名称未設定 mailto:sage [2009/06/16(火) 12:02:37 ID:u5W3blRU0]
>>229
そんなのが普通だなんて言う人はじめてみた
iWork 09なんか明らかにCore Animation使ってるけど10.4から対応してるよね
ダイナミックに内部で切り分けられてユーザに選ばせることすらさせなくていいのがObjective-Cじゃないの

236 名前:名称未設定 mailto:sage [2009/06/16(火) 12:47:02 ID:g72K1aOw0]
>>235
10.3と10.4を別々にリリースというのは見かけるけどね

237 名前:名称未設定 mailto:sage [2009/06/16(火) 13:20:34 ID:1Z4L+RJ80]
ちなみにiWork09みたいにフレームワークのリンクをOSによって動的にしわけるのはどうするんだろう

238 名前:名称未設定 mailto:sage [2009/06/17(水) 00:28:42 ID:Qs4wlMQ20]
developer.apple.com/technotes/tn2002/tn2064.html
かな?情報がちと古いが...
developer.apple.com/documentation/DeveloperTools/Conceptual/cross_development/Introduction/CrossDevelopment.html
これとか?

239 名前:名称未設定 mailto:sage [2009/06/17(水) 01:20:53 ID:YfGS704U0]
オレはこれを良く使うけど。
floor( NSAppKitVersionNumber ) <= NSAppKitVersionNumberxx_x

developer.apple.com/releasenotes/Cocoa/AppKit.html

240 名前:名称未設定 mailto:sage [2009/06/17(水) 10:38:58 ID:mPj8SVVR0]
NSObjectにperformSelector:onThread:withObject:waitUntilDone:ってあるけど
main threadからsub threadに対して実行したい場合、どうやったらmain threadは
sub threadのobjectを得ることが出来るの?



241 名前:名称未設定 mailto:sage [2009/06/17(水) 11:39:00 ID:hjtBqrkM0]
それを投げるってことはNSThreadオブジェクトがあることを知っているはず。
知ってるならそれを作った人を知ってるはず。(同じ人かも)
作った人はNSThreadのオブジェクトを保持することが可能なはず。


242 名前:名称未設定 mailto:sage [2009/06/17(水) 13:07:22 ID:mPj8SVVR0]
NSThreadでは生成したスレッドのオブジェクトを返さないから投げる先が
わからんということなんだが。

243 名前:名称未設定 mailto:sage [2009/06/17(水) 13:19:39 ID:lUCcTzPg0]
メインスレッドで使っているインスタンス変数を、そのままサブスレッドでも使えますよ
スレッドセーフになるように気をつけるひつようはありますが

244 名前:名称未設定 mailto:sage [2009/06/17(水) 15:31:09 ID:f6VhEUD60]
>>242
initかinitWithTarget:selector:object:すれば
NSThreadオブジェクトもらえますが?

245 名前:名称未設定 mailto:sage [2009/06/17(水) 17:56:11 ID:xB/8umtP0]
アップルスクリプトからの、NSAppleEventDescriptor*型の返り値を変数resultに入れ、
以下のように数値として利用しています。
result = [script executeAndReturnError: &error];
resultString = [result stringValue];
[resultString intValue](〜以下略)
なんだかとてもまどろっこしいやり方に自分で思えるのですが、もっとスマートな方法はあるでしょうか?


246 名前:245 mailto:sage [2009/06/17(水) 18:09:33 ID:xB/8umtP0]
>>245
書き忘れました。resultStringはNSString* です。

[resultString initWithString:[result stringValue]];
を試してもだめだったのですが、初心者なもので上記のコードと何が違うのかがよくわかりません。
併せて説明してもらえたらうれしいです。

247 名前:名称未設定 mailto:sage [2009/06/17(水) 18:23:15 ID:hDwFLfNR0]
int val = [[result stringValue] intValue];



248 名前:名称未設定 mailto:sage [2009/06/17(水) 18:28:13 ID:hjtBqrkM0]
-[NSAppleEventDescriptor int32Value]

249 名前:245 mailto:sage [2009/06/17(水) 19:26:57 ID:xB/8umtP0]
>>247,248
ありがとう。
int val = [[result stringValue] intValue];  でうまくできました。
[NSAppleEventDescriptor int32Value]  だとwarningが出るのですが、自分で調べてみます。

250 名前:名称未設定 mailto:sage [2009/06/17(水) 20:12:47 ID:Jk9H1Q7a0]
ん?int, longなら、[result intValue], [result inttegerValue] でええがな。
NSStringリファレンスを見てみ。Getting Numeric Values って項目があるっしょ。



251 名前:名称未設定 mailto:sage [2009/06/17(水) 20:14:32 ID:Jk9H1Q7a0]
うわっ…ごめん、さっきのは無しにして下さい。勘違いしてた。

252 名前:名称未設定 mailto:sage [2009/06/18(木) 00:52:27 ID:Nv8LVQiH0]
コマンドラインツール内でCocoaを使用していて、エラー出力にNSErrorを用いています。
通常のCocoaアプリケーションをローカライズしている場合、NSErrorの
-(NSString *)localizedDescription;でローカライズされたエラー内容が得られるのですが、
これをコマンドラインツールで行うにはどうしたら良いでしょうか?
nibやLocalizable.stringと違ってコマンドラインのバイナリ自体はXcodeからローカライズできないようです。
ツールの使用はターミナル上でなくて、NSTaskでの使用を想定しています。
ご教示よろしくお願いします。






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<139KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef