1 名前:デフォルトの名無しさん mailto:sage [2014/11/01(土) 13:35:17.70 ID:12FSUUrY.net] Objective-C(オブジェクティブ シー)はプログラミング言語の一種。C言語をベースにSmalltalk型のオブジェクト指向機能を持たせた上位互換言語。 (Wikipedia:ja.wikipedia.org/wiki/Objective-C より) 前スレ Objective-C [ObjC part:8]; peace.2ch.net/test/read.cgi/tech/1356341803/ Objective-C [ObjC part:7]; toro.2ch.net/test/read.cgi/tech/1330330906/ Objective-C [ObjC part:6]; toro.2ch.net/test/read.cgi/tech/1313891268/ Objective-C [ObjC part:5]; hibari.2ch.net/test/read.cgi/tech/1279730299/ Objective-C [ObjC part:4]; pc12.2ch.net/test/read.cgi/tech/1239721860/ Objective-C [ObjC part:3]; ttp://pc12.2ch.net/test/read.cgi/tech/1186543111/ Objective-C ttp://pc11.2ch.net/test/read.cgi/tech/1106983092/ Objective-C ttp://pc5.2ch.net/tech/kako/990/990574267.html
481 名前:デフォルトの名無しさん mailto:sage [2016/09/25(日) 19:39:59.75 ID:sZGCwOzX.net] ジェネリクスは去年からだろ 今年はクラス変数(Type Property)が追加された
482 名前:デフォルトの名無しさん [2016/10/06(木) 22:17:15.09 ID:Ppn//x8R.net] すいません、objective-c触れたばっかで全然勝手が分からないんですが、 void play_sound(NSString* str) { NSSound* sound = [NSSound soundNamed : str]; [sound play]; } int main() { play_sound(@
483 名前:デフォルトの名無しさん [2016/10/06(木) 22:19:20.70 ID:Ppn//x8R.net] なんか途切れちゃってる... int main() { play_sound(@"ファイル名.mp3"); } >>473 の soundは[sound release];は必要なんでしょうか?
484 名前:デフォルトの名無しさん mailto:sage [2016/10/07(金) 00:37:46.25 ID:yL88npXy.net] 2chのバグだろ 書き込み確認画面が出る際、" を使うと、そこで文字列の終了とみなされる。 " を、\" とエスケープすれば、どうだろう?
485 名前:デフォルトの名無しさん mailto:sage [2016/10/07(金) 00:40:22.25 ID:X6DZ7p2C.net] 普通"に実体参照でエスケープして書き込むだろ
486 名前:デフォルトの名無しさん mailto:sage [2016/10/07(金) 00:46:39.49 ID:X6DZ7p2C.net] >>473 ちなみにクラスメソッドはコンビニエンスコンストラクタだからreleaseはいらない poolブロックで開放すると良い soundの場合再生終了時にね
487 名前:デフォルトの名無しさん mailto:sage [2016/10/07(金) 00:48:31.69 ID:A3oY7q9i.net] test1
488 名前:デフォルトの名無しさん mailto:sage [2016/10/07(金) 00:49:01.66 ID:A3oY7q9i.net] >>475 > 書き込み確認画面が出る際、" を使うと、そこで文字列の終了とみなされる。 ホントだ。信じられん……
489 名前:デフォルトの名無しさん [2016/10/07(金) 00:55:53.92 ID:UYUTVtAf.net] >>477 回答あざっす pool処理ってこんな感じでいいんでしょうか? NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; /--------ここに処理を記述---------/ [pool release];
490 名前:デフォルトの名無しさん mailto:sage [2016/10/07(金) 00:58:48.10 ID:X6DZ7p2C.net] >>480 @autoreleasepool{ } でいいよ てかsoundならallocでイニシャライズして好きなタイミングでリリースした方がいいんじゃない 以前のOSではNSSoundのautorelease不具合あったし
491 名前:デフォルトの名無しさん [2016/10/07(金) 01:04:41.28 ID:UYUTVtAf.net] >>481 すいません マジ初心者なんでallocでイニシャライズする部分を具体的に書いてもらえると助かります objective-c触れたばっかなんで お手数かけてすみません
492 名前:デフォルトの名無しさん [2016/10/07(金) 01:11:24.99 ID:UYUTVtAf.net] openglいじってて、サウンドもつけたくなり でもそれだとCocoaFramework必要になって ほんとはcで済ませたかったんですが、objective-cじゃないとCocoa使えないからということで ほんとに無知ですんません
493 名前:デフォルトの名無しさん mailto:sage [2016/10/07(金) 01:19:10.67 ID:X6DZ7p2C.net] >>482 NSSoundDelegateで再生終了時のdidFinishPlayingを拾ってリリーすれば良いんじゃない -(void)playSE{ NSString*path= @"音パス"; NSSound *se = [[NSSound alloc] initWithContentsOfFile:path byReference:YES]; [se setDelegate:self]; [se play]; } -(void)sound:(NSSound *)sound didFinishPlaying:(BOOL)aBool{ [sound release]; }
494 名前:デフォルトの名無しさん [2016/10/07(金) 01:20:54.04 ID:UYUTVtAf.net] >>484 凄く分かりやすいです!本当にありがとうございます
495 名前:デフォルトの名無しさん mailto:sage [2016/10/07(金) 01:22:54.60 ID:X6DZ7p2C.net] ゲームかなんか? それならエフェクト追加とかミキサーで多重再生とかしたくなるだろうから AudioUnitでやると便利だよ
496 名前:デフォルトの名無しさん [2016/10/07(金) 01:29:40.94 ID:UYUTVtAf.net] >>486 ゲームってわけじゃないんですが 一応ゲーム作るなら情報豊富なdxlib使おうかと思いますし・・・ ほんとに軽くSEほしいなぐらいなんで でも一応検討します 回答わかりやすかったです 何回も言ってますけどw本当にありがとうございます
497 名前:デフォルトの名無しさん mailto:sage [2016/10/07(金) 01:33:04.00 ID:X6DZ7p2C.net] そこはdirectXなのかよwww ドザーなのか
498 名前:デフォルトの名無しさん [2016/10/07(金) 01:35:22.75 ID:UYUTVtAf.net] >>488 windows故障してしばらくosx使ってます 使いたおしたらまたwindows戻ろうかなって(小声
499 名前:デフォルトの名無しさん [2016/10/07(金) 01:38:54.58 ID:UYUTVtAf.net] iOSだと大量のリファレンスそれも日本語の(英語でも一応なんとかなりますけど・・・ があるのにOSXのほうはなかなか見つけるのが難しくて苦労してます(探し方わるいのかもしれんけど)
500 名前:デフォルトの名無しさん [2016/10/12(水) 21:41:24.49 ID:fMOTdRji.net] クラスを配列で作りたいんだけどこれって大丈夫? @interface myclass : NSObject{ int kazu; } -(void)set : (int) i; -(void)print; @end @implementation myclass -(void)set : (int) i { self->kazu = i; } -(void)print { printf(”%d\n”, kazu); } @end int main() { @autoreleasepool { myclass* obj[3]; for(int i=0; i<3; ++i) obj[i] = [ [myclass alloc]init ]; for(int i=0; i<3; ++i) [obj[i]set : i*10]; for(int i=0; i<3; ++i) [obj[i]print]; } return 0; }
501 名前:デフォルトの名無しさん mailto:sage [2016/10/12(水) 23:42:00.99 ID:GIO3EA35.net] 構造体と配列はARCが効かないからメモリーリークするんじゃなかったっけ? autoreleasepool抜けた後 -(void) dealloc {} ちゃんと呼ばれる?
502 名前:デフォルトの名無しさん [2016/10/13(木) 00:28:51.23 ID:d0+eFHBu.net] >>492 え、ARC効かないんか・・・ じゃあ[obj[i] release]; しないといけないってこと?
503 名前:デフォルトの名無しさん [2016/10/13(木) 00:34:33.56 ID:d0+eFHBu.net] 間違えた [obj[i] dealloc];ってことになるのか?
504 名前:デフォルトの名無しさん mailto:sage [2016/10/13(木) 00:41:30.99 ID:5gkYrLUa.net] いや、やるとしても [obj[i] release]; でしょ メモリー管理のポリシー的にdeallocメソッドは滅多なことでは使わない
505 名前:デフォルトの名無しさん [2016/10/13(木) 00:45:19.72 ID:d0+eFHBu.net] 了解、あんまこういうの載ってるとこなくて質問させてもらいました ありがと
506 名前:デフォルトの名無しさん [2016/10/13(木) 00:47:40.63 ID:d0+eFHBu.net] ってかこういう処理ってobj-cで普通どうやるの? C++だったらvectorにぶち込むとか javaだったらガンガンnewしちゃうけど・・・
507 名前:デフォルトの名無しさん [2016/10/13(木) 00:54:16.14 ID:d0+eFHBu.net] (別にvectorにぶち込まなくても普通に配列で作れたわ 恥ずかしい・・・)
508 名前:デフォルトの名無しさん mailto:sage [2016/10/13(木) 01:30:12.49 ID:TfTkEqcE.net] >>491 大丈夫。 myclass* obj[3]; //ポインタ型の配列 省略されてるがstrong ARC有効なのでmainのスコープを抜けた時に解放される。 @autoreleasepoolは要らない。
509 名前:デフォルトの名無しさん mailto:sage [2016/10/13(木) 01:33:33.88 ID:TfTkEqcE.net] ARCだからreleaseは呼べないので、解放されるかチェックするなら @implementation myclass - (void)dealloc { NSLog(@“%s”, __func__); } @end
510 名前:デフォルトの名無しさん [2016/10/13(木) 01:55:06.63 ID:d0+eFHBu.net] >>499 ありがとう ちなみにだけど、xcode重くて 小さい規模ならgccのほうよく使ってるんだけど ARC効かない環境だったら上記みたいに@autopoolrelease必要だよね?
511 名前:デフォルトの名無しさん [2016/10/13(木) 01:59:27.13 ID:d0+eFHBu.net] あと、ARCなしだったら -(void)deallocに[super dealloc];必要だよね
512 名前:デフォルトの名無しさん [2016/10/13(木) 02:02:15.85 ID:d0+eFHBu.net] >501 ごめん変なこと書いた objective-c始めたばっかだからおかしなこと書いてスマソ ってことはARC効かなかったら手動でreleaseしないといけないってことだよね [obj[i] release];
513 名前:デフォルトの名無しさん mailto:sage [2016/10/13(木) 02:11:12.99 ID:TfTkEqcE.net] >>497 これで動作確認してみたよ。(ARC) -deallocも呼ばれる。 int main() { myclass* obj[3]; for(int i=0; i<3; ++i) { obj[i] = [ [myclass alloc]init ]; [obj[i]set : i*10]; [obj[i]print]; } return 0; } >>502 MRCなら[super dealloc]; を末尾で呼びます。 >>503 手動でretain, releaseなんだけど、init系はretain済みを返すとか、 コンビニエンスコンストラクタはautorelease済みを返すとか、 ViewにaddSubviewしたらretainされるとか、いろいろややこしいかもよw あと、Xcodeのテンプレではmain()に@autoreleasepoolがあるけど、 ARCなら上記のとおり解放されるし、どのみちmainを抜けたらアプリ終了で解放されるんだよね。
514 名前:デフォルトの名無しさん [2016/10/13(木) 02:18:38.99 ID:d0+eFHBu.net] >>504 ほんとに助かります ありがと ってか素直にxcode使いますw OSXとiOS意外の環境にObjective-c流行らないのって これ関係だよね(メモリの管理) GNUstepも確か手動でしょ?メモリ解放 むしろなれてるcの方がメモリ管理楽に感じる(小声
515 名前:デフォルトの名無しさん mailto:sage [2016/10/13(木) 02:32:47.05 ID:TfTkEqcE.net] >>505 GCCはARC未サポートみたいだね。 MRCの基本自体は簡単なんだけどね。
516 名前:デフォルトの名無しさん [2016/10/14(金) 14:48:31.14 ID:v9j5dzmv.net] 教えてください。 詳解Objective-C2.0第3版を読んでいます。ランタイムシステムってのが出てくるんですけど、これはアプリ1つに一個起動されるのでしょうか?それとも、OSの起動毎に一個起動されるのでしょうか?
517 名前:デフォルトの名無しさん [2016/10/14(金) 14:59:05.79 ID:v9j5dzmv.net] Objective-Cのランタイムってのは<objc/runtime.h>に定義されている、Cの関数郡って事らしい。木下本に記載があるらしい。たとえば、objc_setAssociatedObject() / objc_getAssociatedObject() ってのがあるって事だ。
518 名前:デフォルトの名無しさん mailto:sage [2016/10/14(金) 15:32:44.99 ID:lawu0WKC.net] >>507 これ読んでみて Objective-Cランタイムシステムは、すべてのクラスオブジェクトに対してinitializeメッセージを送信します。 各クラスは、ほかのいずれのメッセージよりも先にこのメッセージを受け取ります。 その結果、クラスの使用に先立ってクラス独自のランタイム環境を準備できます。 https://developer.apple.com/jp/documentation/Multithreading.pdf
519 名前:デフォルトの名無しさん mailto:sage [2016/10/14(金) 23:13:42.95 ID:lawu0WKC.net] >>507 まずアプリごとに別プロセスであって、その上でスレッドを実行している。 ランタイム自体はCの関数群なので、アプリがマルチスレッドの場合はスレッドごとにスタックを確保し実行される。 なので、ランタイムはアプリに1個ではなくスレッドに1個ということだね。 スレッドごとにプライオリティが違うのでランタイムの実行速度も違うわけだし。 あんまり詳しく無いけどこんな感じだと思います。
520 名前:デフォルトの名無しさん [2016/10/15(土) 08:39:31.98 ID:KMpEggfz.net] >>510 レス、あんがとう! 納得です。
521 名前:デフォルトの名無しさん mailto:sage [2016/10/15(土) 08:59:48.13 ID:dlnFVU64.net] なんかおかしくないかと思ったが、質問者が納得したならいいか
522 名前:デフォルトの名無しさん mailto:sage [2016/10/15(土) 09:12:48.51 ID:3zvDUrQk.net] ランタイムって起動時にクラス登録したりメソッド登録したりして、 メソッド呼び出し時にメソッド解決するためのシステムやろ。 アプリに1つずつじゃないの。
523 名前:508 mailto:sage [2016/10/15(土) 09:29:45.08 ID:dk6au9gQ.net] スレッドに1個というのは、スレッド毎にスタックメモリを確保してるという意味で、 ただの関数なんだからそうなるよね。 ソースまだ読んで無いけどw
524 名前:デフォルトの名無しさん mailto:sage [2016/10/15(土) 10:10:00.08 ID:dk6au9gQ.net] 時間ある人読んでみて。違ったら教えてw ダイナミックObjective-C news.mynavi.jp/column/objc/014/ ソース opensource.apple.com/source/objc4/objc4-267/runtime/
525 名前:デフォルトの名無しさん [2016/10/15(土) 10:11:59.38 ID:KMpEggfz.net] >>513 根拠やソースをどうぞ! ランタイムって言葉は、乱用されてるので、誤解を招きやすいよねぇ。 Visual Basicランタイムてのは、実態はdll(osxでいうとdylib)で、具体的には Msvbvm60.dll vb6jp.dll Stdole2.tlb Oleaut32.dll Olepro32.dll Comcat.dll Asycfilt.dll Ctl3d32.dll ですよねぇ。 同様に、Obj-Cのランタイムは、libobjc.A.dylibってことですね。 Objective-C Runtime Reference - Developer - Apple Objective-C runtime library support functions are implemented in the shared library found at /usr/lib/libobjc.A.dylib.
526 名前:デフォルトの名無しさん [2016/10/15(土) 10:17:34.69 ID:KMpEggfz.net] >>513 この人は多分こんな誤解をしている。 ランタイムシステムっていうプロセスがアプリが起動される度にfork(生成されて)されて、「xxxやyyyって仕事をしている」 だから、アプリが複数起動されると、メモリはランタイムシステムで溢れかえる。 androidでは、アプリが起動される度にVMがforkされる様に。
527 名前:デフォルトの名無しさん [2016/10/15(土) 10:26:13.78 ID:KMpEggfz.net] こんな理解で、ええんでっしゃろか? libobjc.A.dylib ― obj-c runtime libobjc.B.dylib ― core foundation
528 名前:デフォルトの名無しさん mailto:sage [2016/10/15(土) 10:32:53.00 ID:3zvDUrQk.net] なんでプロセスの話になってんの。お前が何を言ってるのかまるで分からない。
529 名前:デフォルトの名無しさん mailto:sage [2016/10/15(土) 11:01:56.05 ID:fVu0gjAI.net] obj-c runtimeは、dylibとして実装されている。通常、OS起動時に仮装メモリ上にロードされるので、アプリ起動時に新たにロードされることはない。 Cocoa/Foundationにリンクしてコンパイルされたバイナリがメモリ上にロードされると、仮装メモリ上のdylibイメージがプロセスのメモリ空間にマップされ、objc runtimeとして利用出来るようになる。 ランタイムの初期化はプロセス毎だが、独立したプロセスとして実装されている訳ではない。
530 名前:デフォルトの名無しさん [2016/10/15(土) 11:28:07.92 ID:KMpEggfz.net] >>520 なんがと! メモリへのマップはshmat(shared memory attatch)で行われるって理解でOK? man shmat BSD System Calls Manual SHMAT(2) DESCRIPTION shmat() maps the shared memory segment associated with the shared memory identifier shmid into the address space of the calling process.
531 名前:デフォルトの名無しさん mailto:sage [2016/10/15(土) 14:20:50.64 ID:5BWmrAPA.net] それはプロセス間共有メモリで別物かと。 キチンと調べるならMACH-O binaryとかかな? www.m4b.io/reverse/engineering/mach/binaries/2015/03/29/mach-binaries.html 記憶ではApple のmach-O file format referenceとかあったはずだが検索で見つからない。
532 名前:デフォルトの名無しさん mailto:sage [2016/10/16(日) 10:35:31.41 ID:FpSgdyT6.net] 基本的にクラス(インスタンス)のプロセスを動的に管理するOSのようなものが Objective-Cのアプリが動作している間中必要なので ずっとそこに基本管理プログラムとして居続けてるかと。 (アプリが動作してない時もアプリが起動した途端にいるから常駐してる)
533 名前:デフォルトの名無しさん [2016/10/16(日) 11:28:22.44 ID:xF5nqLB3.net] >>523 意味不明! クラス(インスタンス)のプロセスってなに? プロセスを動的に管理するOSのようなものって? ずっとそこに基本管理プログラムとして居続けてるかと? 一体何が、いると思ってるんだ?
534 名前:デフォルトの名無しさん mailto:sage [2016/10/16(日) 11:50:42.07 ID:3UpkNFG/.net] 普通、コンパイル言語のランタイムというとその言語の機能を実現するための低レベルのライブラリの事。 これらのライブラリを呼ぶコードはコンパイラが生成するが、ユーザーが明示的にこれらを呼ぶ事はない。 また、ユーザーのプログラムのmainに飛ぶ前にこのランタイム環境は初期化され、普通は単に アプリケーションプロセスの一部でしかない。 例えばObjective-Cのランタイムにはダイナミックなメッセージングを実現するためのAPIが含まれる。 Objective-C Runtime https://developer.apple.com/reference/objectivec/1657527-objective_c_runtime
535 名前:デフォルトの名無しさん mailto:sage [2016/10/16(日) 13:08:49.80 ID:vrM29RHh.net] PCあぷり屋さんって、どのようにしてアプリがCPUで実行されてるのか知らない人多いよねたぶん
536 名前:デフォルトの名無しさん [2016/10/16(日) 16:25:18.60 ID:xF5nqLB3.net] >>526 では、どの様にして、知る事になりました? 何か良い教科書あります? 俺が良かったのは、パタヘネ、最初の数章でもすげー役立つ。 それから、オブジェクト指向でなぜつくるのか。 良書があれば、紹介よろしくお願いします。
537 名前:デフォルトの名無しさん mailto:sage [2016/10/16(日) 18:02:27.53 ID:LrWAw6Fi.net] このランタイム質問者、ちょっと頭変だな。
538 名前:デフォルトの名無しさん mailto:sage [2016/10/16(日) 18:43:10.86 ID:ffIkMhfP.net] >>524 いったい何が?もなにも、Objective-Cは[[class alloc] init]の形で動的にメッセージを受け取ってインスタンスを生成するので クラスにメッセージを受け渡してメモリ配置などを管理する"誰か"がいないと動かないが。 たぶん根本的に君が"動的"の概念を理解していないか、"ちょっと頭変"なのかどちらか。
539 名前:デフォルトの名無しさん mailto:sage [2016/10/16(日) 21:29:21.51 ID:TQzOcNUQ.net] みんな少しずつおかしいなw ランタイムは常駐はしてないし、別プロセスや別スレッドで動くようなもんでもないし、dylibの形をしているとは限らないぞ ただ暗黙に呼び出されてるだけで単なる関数群の事だよ
540 名前:デフォルトの名無しさん mailto:sage [2016/10/16(日) 21:41:55.63 ID:3UpkNFG/.net] >>529 objective-c のメッセージングは最終的には関数呼び出しでしかない。 class_getInstanceMethodでクラスとセレクタ名からメソッドを得て それを呼び出すだけ。 「メッセージを受け取る」というのは言語の概念的なイメージであって 実装とは乖離している。
541 名前:デフォルトの名無しさん mailto:sage [2016/10/17(月) 05:56:51.62 ID:ur/Bh7VH.net] frameworkのサポートは単なるラッパで実態はdylibだとずっと思ってたんだけど...実装違うのか?だとしたらごめん。
542 名前:デフォルトの名無しさん mailto:sage [2016/10/17(月) 06:14:09.00 ID:yAttM8H1.net] いやframeworkは確かにdylibとヘッダその他をまとめたもんだけと 今話している「言語」ランタイムはframeworkのことじゃないから frameworkのことを、例えばQuickTimeランタイムみたいに呼ぶこともあるからややこしいけど
543 名前:デフォルトの名無しさん [2016/10/17(月) 09:31:44.72 ID:v6qceZ1M.net] >>531 うん!素晴らしい説明ありがとう。
544 名前:デフォルトの名無しさん [2016/10/17(月) 10:00:29.08 ID:v6qceZ1M.net] >>530 ですよねぇ。 ランタイムは libobjc.A.dylib ― obj-c runtime にアーカイブされた単なる関数群。
545 名前:デフォルトの名無しさん [2016/10/17(月) 10:16:02.28 ID:v6qceZ1M.net] >>532 ほぼ合ってるでしょ! frameworkの実態は複数のdylib。というよりdylibそのもの。 単なるwrapperってのは、違うかな。 dylibはobjective-cのクラスやグローバル関数などなどをアーカイブたライブラリー。このobjective-cのライブラリーは、core foundationやrun timeと呼ばれるC言語関数群のwrapperとなっている。 core foundationやrun timeは >>518 >libobjc.A.dylib ― obj-c runtime >libobjc.B.dylib ― core foundation に入っている。 hello worldプログラムをコンパイルしてa.outを作成し、otool -L a.outコマンドを打ってみると判る。 a.out: /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1226.10.1) と思ったけど、libobjc.B.dylibなんで出てこず、libSystem.B.dylibって表示された?
546 名前:デフォルトの名無しさん [2016/10/17(月) 10:18:49.39 ID:v6qceZ1M.net] Objective-C runtime library support functions are implemented in the shared library found at /usr/lib/libobjc.A.dylib. https://developer.apple.com/reference/objectivec/1657527-objective_c_runtime
547 名前:デフォルトの名無しさん [2016/10/17(月) 10:22:05.11 ID:v6qceZ1M.net] >>533 ランタイムは、ランタイムライブラリーを省略した文言で、ちゃんとdylibの形をしているんちゃうんか? だって、AppleのサイトでObjective-C Runtimeって検索するとruntime libraryって書いてあるし。
548 名前:デフォルトの名無しさん mailto:sage [2016/10/17(月) 10:34:16.48 ID:vi4PRwIq.net] >>536 > hello worldプログラムを 俺のには含まれてるぞ $ otool -L a.out a.out: /usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0) /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation (compatibility version 300.0.0, current version 1154.0.0) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1213.0.0) /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 1153.18.0) ソースは単に //hello.m #import <Foundation/Foundation.h> int main (int argc, const char * argv[]) { NSLog (@"Hello, World!"); return 0; }
549 名前:537 mailto:sage [2016/10/17(月) 10:40:26.72 ID:vi4PRwIq.net] >>536 ひょっとして、.mファイルだけど中身はまったくCのhello worldをコンパイルしたんじゃないか? objective-CはCはそのままコンパイルできる。 Objective-cの機能を使ってなければobjective-Cの ランタイムをリンクしなくてもそのまま走る。
550 名前:537 mailto:sage [2016/10/17(月) 10:54:39.51 ID:vi4PRwIq.net] >>539 ごめん、その例では悪かった。 それもobjective-Cの機能は使ってない。 使った例としては: #import <Foundation/Foundation.h> int main (int argc, const char * argv[]) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSLog (@"Hello, World!"); [pool drain]; return 0; } コマンドラインでobjcのコンパイルの仕方で cc -lobjc … という例を見たのでそれを付けてたら強制的にobjcランタイムをリンクしてた。 objc機能を使ってなければこれを明記しなくても自動的にリンクされる。
551 名前:デフォルトの名無しさん [2016/10/17(月) 11:25:21.72 ID:v6qceZ1M.net] >>540 ご明答 ccなんてコマンドあるのね。 ls -l `which cc` lrwxr-xr-x 1 root wheel 5B 6 13 13:50 /usr/bin/cc -> clang clangへのaliasなのね。知らんかった。Obj-Cなんて極最近触り始めて 良く知らんのだ。
552 名前:デフォルトの名無しさん mailto:sage [2016/10/17(月) 11:37:03.04 ID:4hpKEwJL.net] ccそのものは昔からあるCのコンパイラでしょ、今はgccにリンクしてることが多いが
553 名前:デフォルトの名無しさん [2016/10/17(月) 11:59:05.64 ID:v6qceZ1M.net] 俺的メモ gccとcc(clang)との違い。 ccはコマンドalias。 gccはclangのwrapperコマンド(俺の推測) gcc -v, cc ―versionは、どちらもApple LLVMだと答えてくれる。 cc -framework Foundation hello.m gcc -framework Foundation hello.m と打ってコンパイルして得られるバイナリは同サイズだ。 ll a.out* -rwxr-xr-x 1 ad staff 8.3K 10 17 11:54 a.out -rwxr-xr-x 1 ad staff 8.3K 10 17 11:53 a.out-cc
554 名前:デフォルトの名無しさん [2016/10/17(月) 13:01:16.77 ID:v6qceZ1M.net] ちなみに libobjc.A.dylib libSystem.B.dylib の中にいったいどんなCの関数が入っているのか?classdumpってフリーのコマンドラインツールで調べる事ができるはず。俺、やった事無いけど。
555 名前:デフォルトの名無しさん [2016/10/17(月) 13:15:29.63 ID:v6qceZ1M.net] せっかくだから、 class-dump /usr/lib/libobjc.A.dylib やってみた。 @protocol NSObject @property(readonly, copy) NSString *description; @property(readonly) Class superclass; @property(readonly) unsigned long long hash; - (struct _NSZone *)zone; - (unsigned long long)retainCount; 以下略 Cの関数は入ってなくて、Obj-Cのクラスとか、構造体とかが、入っていた。
556 名前:デフォルトの名無しさん [2016/10/17(月) 13:24:24.90 ID:v6qceZ1M.net] ついでに、 nm -o /usr/lib/libSystem.B.dylib | less こいつの最初の数行は、 /usr/lib/libSystem.B.dylib: 0000000000001abb T R8289209$_pthread_attr_destroy /usr/lib/libSystem.B.dylib: 0000000000001ac0 T R8289209$_pthread_attr_init /usr/lib/libSystem.B.dylib: 0000000000001ac5 T R8289209$_pthread_attr_setdetachstate /usr/lib/libSystem.B.dylib: 0000000000001aca T R8289209$_pthread_create 以下略
557 名前:デフォルトの名無しさん mailto:sage [2016/10/17(月) 13:32:18.66 ID:yAttM8H1.net] >>538 それはたまたまOSX上のObjective-Cでそうなってるだけ 大抵の言語では「言語」ランタイムはスタティックリンクされるし Objective-Cでもlibobjc.aがある環境ならスタティックリンクできる /usr/lib/の下に.oがいくつかあるけど、こいつらも「C言語の」ランタイムでmain関数よりも前の処理になってて 大抵の実行ファイルにはどれかが暗黙にスタティックリンクされてる
558 名前:デフォルトの名無しさん mailto:sage [2016/10/17(月) 13:39:16.83 ID:yAttM8H1.net] あとlibSystem.B.dylibはシステムコールラッパーとC言語の標準ライブラリの一部(libcと分割)なんで ランタイム(実行時)ライブラリであることには間違いはないけど C言語の
559 名前:宴塔^イムというと、普通はスタートアップ(*.o)やlibgccの方を指すと思う [] [ここ壊れてます]
560 名前:デフォルトの名無しさん [2016/10/17(月) 14:05:08.33 ID:v6qceZ1M.net] >>549 nm libSystem.B.dylibの結果はほとんど’U’タイプのSymbolでした。 man nmによると Symbol type ‘U’ = undefinedで、実装は別ファイル、参照だけ!、って事らしいので、 実装はたとえば、libcにあるんだと思います。 nm -o libSystem.B.dylib | grep -v ‘U’すると、出力は極わずかでした。
561 名前:デフォルトの名無しさん [2016/10/20(木) 17:05:03.85 ID:8PkcGQMJ.net] MRC時代のOSXプログラミングの書籍ってなにがありますか?(何を買えばいいですか?) 今はAppleのオンラインドキュメントなどはほとんどARC前提で記述されてるので ネット探してもなかなか見つけられません
562 名前:デフォルトの名無しさん mailto:sage [2016/10/20(木) 17:35:44.02 ID:v715sDMz.net] 古い版の萩原本でもよみゃいいだろ。
563 名前:デフォルトの名無しさん [2016/10/20(木) 19:00:37.37 ID:8PkcGQMJ.net] >>552 https://www.amazon.co.jp/Objective‐C―MacOS-Xプログラミング入門-荻原-剛志/dp/4877780688/ref=sr_1_6?s=books&ie=UTF8&qid=1476957557&sr=1-6 これとかか?
564 名前:デフォルトの名無しさん mailto:sage [2016/10/20(木) 20:24:30.68 ID:ifLlZ1yA.net] 上手に貼れ https://www.amazon.co.jp/dp/4877780688/
565 名前:デフォルトの名無しさん mailto:sage [2016/10/25(火) 13:48:49.63 ID:aBo6S+EN.net] @interface @implementation これに変数2回宣言するだろ? 違いってなんですか?
566 名前:デフォルトの名無しさん mailto:sage [2016/10/25(火) 14:18:03.51 ID:OZkbpJ7G.net] >>555 必要なスコープに1回宣言すればいい。 というか、外部に変数を公開する事は、特殊な事情以外ありえないから、 ヘッダにはアクセサ即ちプロパティを書けばいい。 つまりインスタンス変数なら@implementation{ } のブロックで宣言すればいいよ。 継承した子クラスからその変数へは、親クラスのアクセサ経由でアクセスするのが普通。 こうすると、ヘッダには外部に公開する情報しか現れない。 どうしても子クラスから親クラスの変数に直接触りたい場合は、 親クラスの@interface{ }ブロックで宣言する。 その場合はデフォルトでアクセス制限が@protectedになる。
567 名前:デフォルトの名無しさん mailto:sage [2016/10/25(火) 14:31:48.57 ID:OZkbpJ7G.net] >>555 補足 その変数を外部に公開しないのなら、ヘッダでプロパティにしなくてもいいよ。 プロパティは.mにも書けるし。
568 名前:デフォルトの名無しさん mailto:sage [2016/11/17(木) 12:45:51.00 ID:0S40a4Cy.net] インスタンスメソッドの実行に関して教えてください。 // message sending [obj say: @
569 名前:デフォルトの名無しさん mailto:sage [2016/11/17(木) 13:13:08.74 ID:Psw7U5GH.net] 事切れたか
570 名前:デフォルトの名無しさん mailto:sage [2016/11/17(木) 13:29:09.43 ID:5aO/SijD.net] ダブルクオートとかで切れるのよく見かけるけど、@ でも切れるんかな
571 名前:デフォルトの名無しさん mailto:sage [2016/11/17(木) 13:29:10.81 ID:0S40a4Cy.net] ソースコードが勝手に切られちゃう(サニタイズ関係?)みたいなので画像で失礼します。 インスタンスメソッドの実行に関して教えてください。 message sending / function pointer どちらの方法でもちゃんと動くのは確認できましたが、 なぜ後者はSELパラメータが必須(この場合selector) な仕様になっているんでしょう? 冗長に見えますが何か意味があるんでしょうか。 sss
572 名前:p://o.8ch.net/j7xx.png [] [ここ壊れてます]
573 名前:デフォルトの名無しさん mailto:sage [2016/11/17(木) 13:30:21.21 ID:5aO/SijD.net] @ の次は当然 " がくるだろうけど、今まで1個目の"が表示されて切れるんだよなあ
574 名前:デフォルトの名無しさん mailto:sage [2016/11/17(木) 13:33:39.43 ID:0S40a4Cy.net] > SELパラメータが必須 instanceMethodForSelector: の時点で伝えてあるのに、なぜ実行時にも必要になるのかという事です。
575 名前:デフォルトの名無しさん mailto:sage [2016/11/17(木) 13:40:44.67 ID:+o4tuiiL.net] >>563 1.instanceMethodForSelectorでメソッドの実体である関数のポインタを取得(IMP func) 2.funcをキャストして呼び出し 2のときに、メソッドの暗黙の第1,第2引数である id obj, SEL selectorを渡してます。
576 名前:デフォルトの名無しさん mailto:sage [2016/11/17(木) 13:54:11.06 ID:0S40a4Cy.net] ありがとうございます。それでは改めて聞き直します。 メソッドの暗黙の第2引数が SEL である、そもそもの設計の意図はなんなんでしょう。 内部で振り分ければいいので複数のメソッドに対して一つの関数(ポインタ)が共通で対応可能とか? それが実際にできたとして何かメリットがあるんでしょうか。
577 名前:デフォルトの名無しさん mailto:sage [2016/11/17(木) 14:00:22.50 ID:f6OBJy8Y.net] セレクタを見て他のメソッドにデリゲートするとか。
578 名前:デフォルトの名無しさん mailto:sage [2016/11/17(木) 14:05:35.87 ID:+o4tuiiL.net] ランタイムは、渡されたセレクタをメソッドリストから検索して、有れば実行、無ければエラー。 ってことかな。
579 名前:デフォルトの名無しさん mailto:sage [2016/11/17(木) 14:28:15.44 ID:+o4tuiiL.net] IMP使った場合はランタイムは経由しないでダイレクトに関数コールするけど、 通常は動的にメソッド呼び出しをするのでそういう仕様になってる。 のではないだろうか。
580 名前:デフォルトの名無しさん mailto:sage [2016/11/17(木) 18:17:20.63 ID:ZyPoEOxl.net] サブクラスでのオーバーライドをサポートするために だと思うよ。
581 名前:デフォルトの名無しさん mailto:sage [2016/11/17(木) 21:32:33.37 ID:XVALpd1q.net] Smalltalkで、実行中メソッドのコンテキスト内からそのセレクタを得ることができる機構を Objective-Cでも_cmdパラメーターを介して模したかったからなのでは? Object subclass: Foo [ bar [ thisContext method selector displayNl ] ] Foo new bar "=> #bar "