Objective-C [ObjC part:8.1]; [転載禁止]©2ch.net

■ このスレッドは過去ログ倉庫に格納されています
2014/11/01(土) 13:35:17.70ID:12FSUUrY
Objective-C(オブジェクティブ シー)はプログラミング言語の一種。C言語をベースにSmalltalk型のオブジェクト指向機能を持たせた上位互換言語。
 (Wikipedia:http://ja.wikipedia.org/wiki/Objective-C より)

前スレ
Objective-C [ObjC part:8];
http://peace.2ch.net/test/read.cgi/tech/1356341803/

Objective-C [ObjC part:7];
http://toro.2ch.net/test/read.cgi/tech/1330330906/
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];
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
2016/09/19(月) 06:53:12.40ID:ze/R6ozd
>>438とか言ってるからどれ程に有識かと思ったら
バズワードでしかObjCの機能を説明できない奴らばかりかよ、、、
2016/09/19(月) 08:04:00.68ID:W9V/RaHi
まじでカテゴリとは何かってことか?
既存のクラスに宣言(.h)と実装(.m)を追加するObj-Cのミラクル機能だよ。
例えばNSArrayにobjectAtIndexSafety:を追加する。

oreore.h
@interface NSArray (oreore)
- (id) objectAtIndexSafety:(NSUInteger)index;
@end

oreore.m
@implementation NSArray(oreore)
- (id) objectAtIndexSafety:(NSUInteger)index
{
 if (index < [self count]) {
  return [self objectAtIndex:index];
 }
 return nil;
}
@end
2016/09/19(月) 17:58:43.86ID:gQRJTUbC
javaスレでメソッドってなに?って聞いてるようなもんだから
みんな釣りとしてスルーしてた。
2016/09/19(月) 18:02:17.52ID:VA/o11o6
Objective-CがsmalltalkとCのハイブリッドなので
僕はカテゴリとかの単語の意味含めてメソッド呼び出しの仕組みとかを理解しやすくするにはsmalltalkを体験すべきだと思うのだけどどう?
2016/09/19(月) 22:24:00.74ID:KnX9vMV5
>>464
んー、SmalltalkはObj-Cの [ ] の中身だけでコードを全て記述するような感じの言語で、動的性を学ぶのにいいので
「Smalltalkを体験すべき」っていうのには大筋では賛成。こちら↓はその際の参考まで。

▼Smalltalkをちょっとかじってみたい人のための、チュートリアルまとめ
http://qiita.com/sumim/items/6bed17961bd57daf88a3

でもカテゴリはSmalltalkでは対応するのはトレイトだし、Smalltalkでカテゴリはプロトコルの意味でも使われたり
そのプロトコルもObj-Cのプロトコルとは(名前の由来にはなっているけれど)別物だったりと食い違いもあり
「メソッド呼び出しの仕組み」はともかく、こと「単語(用語)の意味」を知る目的では必ずしもお薦めできない。
2016/09/20(火) 09:47:32.51ID:noK0zumc
似てるってだけでハイブリッド(キリっ)とか
頭湧いてんな
2016/09/20(火) 21:20:03.95ID:cQ8uMGBS
ObjcのハイブリッドはSmalltailkのコンセプトとC言語の処理系のハイブリッドのことだと思うんだけど
そういう意味ならSmalltalkの思想やコンセプトを理解する価値はある気がする。

でもObjcはそんなに難しい言語でもないしそこまでする必要は無い気もする。
2016/09/21(水) 15:26:58.49ID:S1SFikQD
objcらしさはトレンドが早いから今更Smalltalkはどうなのよ
原典の一つではあろうがobjcで学ぶべきじゃね
2016/09/25(日) 19:25:14.70ID:+js0BgEk
いつの間にか NSArray<NSString *> *names; みたいな記法が可能に。
2016/09/25(日) 19:39:59.75ID:sZGCwOzX
ジェネリクスは去年からだろ
今年はクラス変数(Type Property)が追加された
471デフォルトの名無しさん
垢版 |
2016/10/06(木) 22:17:15.09ID:Ppn//x8R
すいません、objective-c触れたばっかで全然勝手が分からないんですが、

void play_sound(NSString* str)
{
  NSSound* sound = [NSSound soundNamed : str];
  [sound play];
}
int main()
{
  play_sound(@
472デフォルトの名無しさん
垢版 |
2016/10/06(木) 22:19:20.70ID:Ppn//x8R
なんか途切れちゃってる...
int main()
{
play_sound(@"ファイル名.mp3");
}
>>471
soundは[sound release];は必要なんでしょうか?
2016/10/07(金) 00:37:46.25ID:yL88npXy
2chのバグだろ

書き込み確認画面が出る際、" を使うと、そこで文字列の終了とみなされる。
" を、\" とエスケープすれば、どうだろう?
2016/10/07(金) 00:40:22.25ID:X6DZ7p2C
普通&quot;に実体参照でエスケープして書き込むだろ
2016/10/07(金) 00:46:39.49ID:X6DZ7p2C
>>471
ちなみにクラスメソッドはコンビニエンスコンストラクタだからreleaseはいらない
poolブロックで開放すると良い
soundの場合再生終了時にね
2016/10/07(金) 00:48:31.69ID:A3oY7q9i
test1
2016/10/07(金) 00:49:01.66ID:A3oY7q9i
>>473
> 書き込み確認画面が出る際、" を使うと、そこで文字列の終了とみなされる。

ホントだ。信じられん……
478デフォルトの名無しさん
垢版 |
2016/10/07(金) 00:55:53.92ID:UYUTVtAf
>>475

回答あざっす

pool処理ってこんな感じでいいんでしょうか?

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
/--------ここに処理を記述---------/
[pool release];
2016/10/07(金) 00:58:48.10ID:X6DZ7p2C
>>478
@autoreleasepool{
}
でいいよ
てかsoundならallocでイニシャライズして好きなタイミングでリリースした方がいいんじゃない
以前のOSではNSSoundのautorelease不具合あったし
480デフォルトの名無しさん
垢版 |
2016/10/07(金) 01:04:41.28ID:UYUTVtAf
>>479
すいません マジ初心者なんでallocでイニシャライズする部分を具体的に書いてもらえると助かります
objective-c触れたばっかなんで
お手数かけてすみません
481デフォルトの名無しさん
垢版 |
2016/10/07(金) 01:11:24.99ID:UYUTVtAf
openglいじってて、サウンドもつけたくなり
でもそれだとCocoaFramework必要になって
ほんとはcで済ませたかったんですが、objective-cじゃないとCocoa使えないからということで
ほんとに無知ですんません
2016/10/07(金) 01:19:10.67ID:X6DZ7p2C
>>480
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];
}
483デフォルトの名無しさん
垢版 |
2016/10/07(金) 01:20:54.04ID:UYUTVtAf
>>482
凄く分かりやすいです!本当にありがとうございます
2016/10/07(金) 01:22:54.60ID:X6DZ7p2C
ゲームかなんか?
それならエフェクト追加とかミキサーで多重再生とかしたくなるだろうから
AudioUnitでやると便利だよ
485デフォルトの名無しさん
垢版 |
2016/10/07(金) 01:29:40.94ID:UYUTVtAf
>>484
ゲームってわけじゃないんですが
一応ゲーム作るなら情報豊富なdxlib使おうかと思いますし・・・
ほんとに軽くSEほしいなぐらいなんで
でも一応検討します
回答わかりやすかったです 
何回も言ってますけどw本当にありがとうございます
2016/10/07(金) 01:33:04.00ID:X6DZ7p2C
そこはdirectXなのかよwww
ドザーなのか
487デフォルトの名無しさん
垢版 |
2016/10/07(金) 01:35:22.75ID:UYUTVtAf
>>486
windows故障してしばらくosx使ってます
使いたおしたらまたwindows戻ろうかなって(小声
488デフォルトの名無しさん
垢版 |
2016/10/07(金) 01:38:54.58ID:UYUTVtAf
iOSだと大量のリファレンスそれも日本語の(英語でも一応なんとかなりますけど・・・
があるのにOSXのほうはなかなか見つけるのが難しくて苦労してます(探し方わるいのかもしれんけど)
489デフォルトの名無しさん
垢版 |
2016/10/12(水) 21:41:24.49ID:fMOTdRji
クラスを配列で作りたいんだけどこれって大丈夫?
@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;
}
2016/10/12(水) 23:42:00.99ID:GIO3EA35
構造体と配列はARCが効かないからメモリーリークするんじゃなかったっけ?
autoreleasepool抜けた後
-(void) dealloc {} ちゃんと呼ばれる?
491デフォルトの名無しさん
垢版 |
2016/10/13(木) 00:28:51.23ID:d0+eFHBu
>>490
え、ARC効かないんか・・・
じゃあ[obj[i] release];
しないといけないってこと?
492デフォルトの名無しさん
垢版 |
2016/10/13(木) 00:34:33.56ID:d0+eFHBu
間違えた
[obj[i] dealloc];ってことになるのか?
2016/10/13(木) 00:41:30.99ID:5gkYrLUa
いや、やるとしても
[obj[i] release];
でしょ
メモリー管理のポリシー的にdeallocメソッドは滅多なことでは使わない
494デフォルトの名無しさん
垢版 |
2016/10/13(木) 00:45:19.72ID:d0+eFHBu
了解、あんまこういうの載ってるとこなくて質問させてもらいました
ありがと
495デフォルトの名無しさん
垢版 |
2016/10/13(木) 00:47:40.63ID:d0+eFHBu
ってかこういう処理ってobj-cで普通どうやるの?
C++だったらvectorにぶち込むとか
javaだったらガンガンnewしちゃうけど・・・
496デフォルトの名無しさん
垢版 |
2016/10/13(木) 00:54:16.14ID:d0+eFHBu
(別にvectorにぶち込まなくても普通に配列で作れたわ 恥ずかしい・・・)
2016/10/13(木) 01:30:12.49ID:TfTkEqcE
>>489
大丈夫。
myclass* obj[3]; //ポインタ型の配列 省略されてるがstrong
ARC有効なのでmainのスコープを抜けた時に解放される。
@autoreleasepoolは要らない。
2016/10/13(木) 01:33:33.88ID:TfTkEqcE
ARCだからreleaseは呼べないので、解放されるかチェックするなら
@implementation myclass
- (void)dealloc
{
 NSLog(@“%s”, __func__);
}
@end
499デフォルトの名無しさん
垢版 |
2016/10/13(木) 01:55:06.63ID:d0+eFHBu
>>497
ありがとう
ちなみにだけど、xcode重くて
小さい規模ならgccのほうよく使ってるんだけど
ARC効かない環境だったら上記みたいに@autopoolrelease必要だよね?
500デフォルトの名無しさん
垢版 |
2016/10/13(木) 01:59:27.13ID:d0+eFHBu
あと、ARCなしだったら
-(void)deallocに[super dealloc];必要だよね
501デフォルトの名無しさん
垢版 |
2016/10/13(木) 02:02:15.85ID:d0+eFHBu
>499
ごめん変なこと書いた
objective-c始めたばっかだからおかしなこと書いてスマソ
ってことはARC効かなかったら手動でreleaseしないといけないってことだよね
[obj[i] release];
2016/10/13(木) 02:11:12.99ID:TfTkEqcE
>>495
これで動作確認してみたよ。(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;
}

>>500
MRCなら[super dealloc]; を末尾で呼びます。

>>501
手動でretain, releaseなんだけど、init系はretain済みを返すとか、
コンビニエンスコンストラクタはautorelease済みを返すとか、
ViewにaddSubviewしたらretainされるとか、いろいろややこしいかもよw

あと、Xcodeのテンプレではmain()に@autoreleasepoolがあるけど、
ARCなら上記のとおり解放されるし、どのみちmainを抜けたらアプリ終了で解放されるんだよね。
503デフォルトの名無しさん
垢版 |
2016/10/13(木) 02:18:38.99ID:d0+eFHBu
>>502
ほんとに助かります ありがと
ってか素直にxcode使いますw
OSXとiOS意外の環境にObjective-c流行らないのって
これ関係だよね(メモリの管理)
GNUstepも確か手動でしょ?メモリ解放
むしろなれてるcの方がメモリ管理楽に感じる(小声
2016/10/13(木) 02:32:47.05ID:TfTkEqcE
>>503
GCCはARC未サポートみたいだね。
MRCの基本自体は簡単なんだけどね。
505デフォルトの名無しさん
垢版 |
2016/10/14(金) 14:48:31.14ID:v9j5dzmv
教えてください。

詳解Objective-C2.0第3版を読んでいます。ランタイムシステムってのが出てくるんですけど、これはアプリ1つに一個起動されるのでしょうか?それとも、OSの起動毎に一個起動されるのでしょうか?
506デフォルトの名無しさん
垢版 |
2016/10/14(金) 14:59:05.79ID:v9j5dzmv
Objective-Cのランタイムってのは<objc/runtime.h>に定義されている、Cの関数郡って事らしい。木下本に記載があるらしい。たとえば、objc_setAssociatedObject() / objc_getAssociatedObject() ってのがあるって事だ。
2016/10/14(金) 15:32:44.99ID:lawu0WKC
>>505
これ読んでみて

Objective-Cランタイムシステムは、すべてのクラスオブジェクトに対してinitializeメッセージを送信します。
各クラスは、ほかのいずれのメッセージよりも先にこのメッセージを受け取ります。
その結果、クラスの使用に先立ってクラス独自のランタイム環境を準備できます。
https://developer.apple.com/jp/documentation/Multithreading.pdf
2016/10/14(金) 23:13:42.95ID:lawu0WKC
>>505
まずアプリごとに別プロセスであって、その上でスレッドを実行している。
ランタイム自体はCの関数群なので、アプリがマルチスレッドの場合はスレッドごとにスタックを確保し実行される。
なので、ランタイムはアプリに1個ではなくスレッドに1個ということだね。
スレッドごとにプライオリティが違うのでランタイムの実行速度も違うわけだし。

あんまり詳しく無いけどこんな感じだと思います。
509デフォルトの名無しさん
垢版 |
2016/10/15(土) 08:39:31.98ID:KMpEggfz
>>508
レス、あんがとう!
納得です。
2016/10/15(土) 08:59:48.13ID:dlnFVU64
なんかおかしくないかと思ったが、質問者が納得したならいいか
2016/10/15(土) 09:12:48.51ID:3zvDUrQk
ランタイムって起動時にクラス登録したりメソッド登録したりして、
メソッド呼び出し時にメソッド解決するためのシステムやろ。
アプリに1つずつじゃないの。
512508
垢版 |
2016/10/15(土) 09:29:45.08ID:dk6au9gQ
スレッドに1個というのは、スレッド毎にスタックメモリを確保してるという意味で、
ただの関数なんだからそうなるよね。
ソースまだ読んで無いけどw
2016/10/15(土) 10:10:00.08ID:dk6au9gQ
時間ある人読んでみて。違ったら教えてw

ダイナミックObjective-C
http://news.mynavi.jp/column/objc/014/

ソース
http://opensource.apple.com/source/objc4/objc4-267/runtime/
514デフォルトの名無しさん
垢版 |
2016/10/15(土) 10:11:59.38ID:KMpEggfz
>>511
根拠やソースをどうぞ!

ランタイムって言葉は、乱用されてるので、誤解を招きやすいよねぇ。
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.
515デフォルトの名無しさん
垢版 |
2016/10/15(土) 10:17:34.69ID:KMpEggfz
>>511
この人は多分こんな誤解をしている。

ランタイムシステムっていうプロセスがアプリが起動される度にfork(生成されて)されて、「xxxやyyyって仕事をしている」

だから、アプリが複数起動されると、メモリはランタイムシステムで溢れかえる。

androidでは、アプリが起動される度にVMがforkされる様に。
516デフォルトの名無しさん
垢版 |
2016/10/15(土) 10:26:13.78ID:KMpEggfz
こんな理解で、ええんでっしゃろか?

libobjc.A.dylib ― obj-c runtime
libobjc.B.dylib ― core foundation
2016/10/15(土) 10:32:53.00ID:3zvDUrQk
なんでプロセスの話になってんの。お前が何を言ってるのかまるで分からない。
2016/10/15(土) 11:01:56.05ID:fVu0gjAI
obj-c runtimeは、dylibとして実装されている。通常、OS起動時に仮装メモリ上にロードされるので、アプリ起動時に新たにロードされることはない。

Cocoa/Foundationにリンクしてコンパイルされたバイナリがメモリ上にロードされると、仮装メモリ上のdylibイメージがプロセスのメモリ空間にマップされ、objc runtimeとして利用出来るようになる。

ランタイムの初期化はプロセス毎だが、独立したプロセスとして実装されている訳ではない。
519デフォルトの名無しさん
垢版 |
2016/10/15(土) 11:28:07.92ID:KMpEggfz
>>518
なんがと!
メモリへのマップは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.
2016/10/15(土) 14:20:50.64ID:5BWmrAPA
それはプロセス間共有メモリで別物かと。

キチンと調べるならMACH-O binaryとかかな?
http://www.m4b.io/reverse/engineering/mach/binaries/2015/03/29/mach-binaries.html

記憶ではApple のmach-O file format referenceとかあったはずだが検索で見つからない。
2016/10/16(日) 10:35:31.41ID:FpSgdyT6
基本的にクラス(インスタンス)のプロセスを動的に管理するOSのようなものが
Objective-Cのアプリが動作している間中必要なので
ずっとそこに基本管理プログラムとして居続けてるかと。
(アプリが動作してない時もアプリが起動した途端にいるから常駐してる)
522デフォルトの名無しさん
垢版 |
2016/10/16(日) 11:28:22.44ID:xF5nqLB3
>>521
意味不明!

クラス(インスタンス)のプロセスってなに?
プロセスを動的に管理するOSのようなものって?

ずっとそこに基本管理プログラムとして居続けてるかと?

一体何が、いると思ってるんだ?
2016/10/16(日) 11:50:42.07ID:3UpkNFG/
普通、コンパイル言語のランタイムというとその言語の機能を実現するための低レベルのライブラリの事。
これらのライブラリを呼ぶコードはコンパイラが生成するが、ユーザーが明示的にこれらを呼ぶ事はない。

また、ユーザーのプログラムのmainに飛ぶ前にこのランタイム環境は初期化され、普通は単に
アプリケーションプロセスの一部でしかない。

例えばObjective-Cのランタイムにはダイナミックなメッセージングを実現するためのAPIが含まれる。

Objective-C Runtime
https://developer.apple.com/reference/objectivec/1657527-objective_c_runtime
2016/10/16(日) 13:08:49.80ID:vrM29RHh
PCあぷり屋さんって、どのようにしてアプリがCPUで実行されてるのか知らない人多いよねたぶん
525デフォルトの名無しさん
垢版 |
2016/10/16(日) 16:25:18.60ID:xF5nqLB3
>>524
では、どの様にして、知る事になりました?
何か良い教科書あります?

俺が良かったのは、パタヘネ、最初の数章でもすげー役立つ。
それから、オブジェクト指向でなぜつくるのか。

良書があれば、紹介よろしくお願いします。
2016/10/16(日) 18:02:27.53ID:LrWAw6Fi
このランタイム質問者、ちょっと頭変だな。
2016/10/16(日) 18:43:10.86ID:ffIkMhfP
>>522
いったい何が?もなにも、Objective-Cは[[class alloc] init]の形で動的にメッセージを受け取ってインスタンスを生成するので
クラスにメッセージを受け渡してメモリ配置などを管理する"誰か"がいないと動かないが。
たぶん根本的に君が"動的"の概念を理解していないか、"ちょっと頭変"なのかどちらか。
2016/10/16(日) 21:29:21.51ID:TQzOcNUQ
みんな少しずつおかしいなw
ランタイムは常駐はしてないし、別プロセスや別スレッドで動くようなもんでもないし、dylibの形をしているとは限らないぞ
ただ暗黙に呼び出されてるだけで単なる関数群の事だよ
2016/10/16(日) 21:41:55.63ID:3UpkNFG/
>>527
objective-c のメッセージングは最終的には関数呼び出しでしかない。 
class_getInstanceMethodでクラスとセレクタ名からメソッドを得て
それを呼び出すだけ。 

「メッセージを受け取る」というのは言語の概念的なイメージであって
実装とは乖離している。
2016/10/17(月) 05:56:51.62ID:ur/Bh7VH
frameworkのサポートは単なるラッパで実態はdylibだとずっと思ってたんだけど...実装違うのか?だとしたらごめん。
2016/10/17(月) 06:14:09.00ID:yAttM8H1
いやframeworkは確かにdylibとヘッダその他をまとめたもんだけと
今話している「言語」ランタイムはframeworkのことじゃないから
frameworkのことを、例えばQuickTimeランタイムみたいに呼ぶこともあるからややこしいけど
532デフォルトの名無しさん
垢版 |
2016/10/17(月) 09:31:44.72ID:v6qceZ1M
>>529
うん!素晴らしい説明ありがとう。
533デフォルトの名無しさん
垢版 |
2016/10/17(月) 10:00:29.08ID:v6qceZ1M
>>528
ですよねぇ。
ランタイムは
libobjc.A.dylib ― obj-c runtime

にアーカイブされた単なる関数群。
534デフォルトの名無しさん
垢版 |
2016/10/17(月) 10:16:02.28ID:v6qceZ1M
>>530
ほぼ合ってるでしょ!
frameworkの実態は複数のdylib。というよりdylibそのもの。
単なるwrapperってのは、違うかな。

dylibはobjective-cのクラスやグローバル関数などなどをアーカイブたライブラリー。このobjective-cのライブラリーは、core foundationやrun timeと呼ばれるC言語関数群のwrapperとなっている。

core foundationやrun timeは
>>516
>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って表示された?
535デフォルトの名無しさん
垢版 |
2016/10/17(月) 10:18:49.39ID:v6qceZ1M
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
536デフォルトの名無しさん
垢版 |
2016/10/17(月) 10:22:05.11ID:v6qceZ1M
>>531

ランタイムは、ランタイムライブラリーを省略した文言で、ちゃんとdylibの形をしているんちゃうんか?

だって、AppleのサイトでObjective-C Runtimeって検索するとruntime libraryって書いてあるし。
2016/10/17(月) 10:34:16.48ID:vi4PRwIq
>>534
> 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;
}
538537
垢版 |
2016/10/17(月) 10:40:26.72ID:vi4PRwIq
>>534
ひょっとして、.mファイルだけど中身はまったくCのhello worldをコンパイルしたんじゃないか?

objective-CはCはそのままコンパイルできる。 Objective-cの機能を使ってなければobjective-Cの
ランタイムをリンクしなくてもそのまま走る。
539537
垢版 |
2016/10/17(月) 10:54:39.51ID:vi4PRwIq
>>537
ごめん、その例では悪かった。 それも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機能を使ってなければこれを明記しなくても自動的にリンクされる。
540デフォルトの名無しさん
垢版 |
2016/10/17(月) 11:25:21.72ID:v6qceZ1M
>>538
ご明答

ccなんてコマンドあるのね。

ls -l `which cc`
lrwxr-xr-x 1 root wheel 5B 6 13 13:50 /usr/bin/cc -> clang

clangへのaliasなのね。知らんかった。Obj-Cなんて極最近触り始めて
良く知らんのだ。
2016/10/17(月) 11:37:03.04ID:4hpKEwJL
ccそのものは昔からあるCのコンパイラでしょ、今はgccにリンクしてることが多いが
542デフォルトの名無しさん
垢版 |
2016/10/17(月) 11:59:05.64ID:v6qceZ1M
俺的メモ

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
543デフォルトの名無しさん
垢版 |
2016/10/17(月) 13:01:16.77ID:v6qceZ1M
ちなみに
libobjc.A.dylib
libSystem.B.dylib
の中にいったいどんなCの関数が入っているのか?classdumpってフリーのコマンドラインツールで調べる事ができるはず。俺、やった事無いけど。
544デフォルトの名無しさん
垢版 |
2016/10/17(月) 13:15:29.63ID:v6qceZ1M
せっかくだから、
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のクラスとか、構造体とかが、入っていた。
545デフォルトの名無しさん
垢版 |
2016/10/17(月) 13:24:24.90ID:v6qceZ1M
ついでに、
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
以下略
2016/10/17(月) 13:32:18.66ID:yAttM8H1
>>536
それはたまたまOSX上のObjective-Cでそうなってるだけ
大抵の言語では「言語」ランタイムはスタティックリンクされるし
Objective-Cでもlibobjc.aがある環境ならスタティックリンクできる

/usr/lib/の下に.oがいくつかあるけど、こいつらも「C言語の」ランタイムでmain関数よりも前の処理になってて
大抵の実行ファイルにはどれかが暗黙にスタティックリンクされてる
2016/10/17(月) 13:39:16.83ID:yAttM8H1
あとlibSystem.B.dylibはシステムコールラッパーとC言語の標準ライブラリの一部(libcと分割)なんで
ランタイム(実行時)ライブラリであることには間違いはないけど
C言語のランタイムというと、普通はスタートアップ(*.o)やlibgccの方を指すと思う
548デフォルトの名無しさん
垢版 |
2016/10/17(月) 14:05:08.33ID:v6qceZ1M
>>547
nm libSystem.B.dylibの結果はほとんど’U’タイプのSymbolでした。

man nmによると
Symbol type ‘U’ = undefinedで、実装は別ファイル、参照だけ!、って事らしいので、
実装はたとえば、libcにあるんだと思います。

nm -o libSystem.B.dylib | grep -v ‘U’すると、出力は極わずかでした。
549デフォルトの名無しさん
垢版 |
2016/10/20(木) 17:05:03.85ID:8PkcGQMJ
MRC時代のOSXプログラミングの書籍ってなにがありますか?(何を買えばいいですか?)
今はAppleのオンラインドキュメントなどはほとんどARC前提で記述されてるので
ネット探してもなかなか見つけられません
2016/10/20(木) 17:35:44.02ID:v715sDMz
古い版の萩原本でもよみゃいいだろ。
551デフォルトの名無しさん
垢版 |
2016/10/20(木) 19:00:37.37ID:8PkcGQMJ
>>550
https://www.amazon.co.jp/Objective‐C―MacOS-Xプログラミング入門-荻原-剛志/dp/4877780688/ref=sr_1_6?s=books&ie=UTF8&qid=1476957557&sr=1-6
これとかか?
2016/10/20(木) 20:24:30.68ID:ifLlZ1yA
上手に貼れ
https://www.amazon.co.jp/dp/4877780688/
2016/10/25(火) 13:48:49.63ID:aBo6S+EN
@interface
@implementation

これに変数2回宣言するだろ?
違いってなんですか?
2016/10/25(火) 14:18:03.51ID:OZkbpJ7G
>>553
必要なスコープに1回宣言すればいい。
というか、外部に変数を公開する事は、特殊な事情以外ありえないから、
ヘッダにはアクセサ即ちプロパティを書けばいい。
つまりインスタンス変数なら@implementation{ } のブロックで宣言すればいいよ。

継承した子クラスからその変数へは、親クラスのアクセサ経由でアクセスするのが普通。
こうすると、ヘッダには外部に公開する情報しか現れない。

どうしても子クラスから親クラスの変数に直接触りたい場合は、
親クラスの@interface{ }ブロックで宣言する。
その場合はデフォルトでアクセス制限が@protectedになる。
2016/10/25(火) 14:31:48.57ID:OZkbpJ7G
>>553
補足
その変数を外部に公開しないのなら、ヘッダでプロパティにしなくてもいいよ。
プロパティは.mにも書けるし。
2016/11/17(木) 12:45:51.00ID:0S40a4Cy
インスタンスメソッドの実行に関して教えてください。

// message sending
[obj say: @
2016/11/17(木) 13:13:08.74ID:Psw7U5GH
事切れたか
2016/11/17(木) 13:29:09.43ID:5aO/SijD
ダブルクオートとかで切れるのよく見かけるけど、@ でも切れるんかな
2016/11/17(木) 13:29:10.81ID:0S40a4Cy
ソースコードが勝手に切られちゃう(サニタイズ関係?)みたいなので画像で失礼します。

インスタンスメソッドの実行に関して教えてください。
message sending / function pointer
どちらの方法でもちゃんと動くのは確認できましたが、
なぜ後者はSELパラメータが必須(この場合selector) な仕様になっているんでしょう?
冗長に見えますが何か意味があるんでしょうか。
2016/11/17(木) 13:30:21.21ID:5aO/SijD
@ の次は当然 " がくるだろうけど、今まで1個目の"が表示されて切れるんだよなあ
2016/11/17(木) 13:33:39.43ID:0S40a4Cy
> SELパラメータが必須
instanceMethodForSelector: の時点で伝えてあるのに、なぜ実行時にも必要になるのかという事です。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。