問題タブ [objective-c-runtime]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
6 に答える
10800 参照

objective-c - 「認識されないセレクターがインスタンスに送信されました」エラーはどういう意味ですか?

次のエラーが原因で、アプリがクラッシュします。

誰かがそれが何を意味するのか、そしてどのように参照0x612b060で私のコードの行を見つけることができるのか教えてもらえますか?

0 投票する
2 に答える
443 参照

objective-c - ブロック内のretainCountは異常な動作を示します

クラスでこのコードを取得しました:

この NSLog() の出力は次のとおりです。

copyメソッドのドキュメントには、次のように書かれています。

特別な考慮事項

マネージ メモリ (ガベージ コレクションではない) を使用している場合、このメソッドは新しいオブジェクトを保持してから返します。ただし、メソッドの呼び出し元は、返されたオブジェクトを解放する責任があります。

そう。NSLog() の出力が常に同じ値を示す方法はretainCount?

0 投票する
2 に答える
1834 参照

objective-c - 目的の C 初期化

免責事項、私はObjective Cを初めて使用しますが、これが説明されていません。init を実装する 2 つの方法を見てきました。

だから私が持っているとしましょう:

ここで、MyObject クラスは NSObject のサブクラスです。2 番目の例では、init は NSObject の初期化されたバージョンを返しませんか? だから myObj は...どうやってそれが何であるかを知るのでしょうか? MyObject ではなく NSObject だと思いませんか?

0 投票する
1 に答える
1054 参照

iphone - Objective-C: 複数のスレッドから同じブロックを呼び出してコピーする

ここではニューラル ネットワークを扱っていますが、実際の問題は Objective-C のブロックを処理する必要があるため、無視しても問題ありません。これが私の問題です。ニューラル ネットワークを一度に実行できる大きなブロックに変換する方法を見つけました。ただし、ネットワークのアクティブ化に比べて、非常に遅くなります。これは少し直感に反するようです。

次のようなネストされた関数のグループを指定した場合

理論的には、その関数を複数回実行する方が、一連の接続をループしてノードをアクティブ/非アクティブに設定するよりも簡単/高速である必要があります。これらはすべて、最終的にこの同じ関数を本質的に計算します。

ただし、ブロックを作成して (スレッド:実行時に関数を作成する方法を参照)、このコードを実行すると、適度なサイズのネットワークでは非常に遅くなります。

今、私がよく理解していないのは次のとおりです。

  1. ブロックをコピーするとき、正確には何をコピーしていますか?
  2. たとえば、ブロックを copy1 と copy2 の 2 回コピーするとします。同じスレッドでcopy1 と copy2 を呼び出した場合、同じ関数が呼び出されますか? ドキュメントがブロック コピーに対して何を意味するのか正確にはわかりません: Apple Block Docs
  3. ここで、copy1 と copy2 のコピーをもう一度作成しますが、代わりにのスレッドでコピーを呼び出すと、関数はどのように動作するのでしょうか? 各スレッドが同じブロックにアクセスしようとするため、これにより何らかの速度低下が発生しますか?
0 投票する
1 に答える
1934 参照

objective-c - 実行時に決定される大きな構造体型を返す IMP 関数を実装する方法は?

背景: CamelBones は Perl クラスを Objective-C ランタイムに登録します。これを行うには、すべての Perl メソッドが同じ IMP 関数に登録されます。その関数はself&_cmd引数を調べて、呼び出す Perl メソッドを見つけます。

これは、 でディスパッチされたメッセージに対して、数年間十分に機能していますobjc_msgSend。しかし今は、Perl メソッドから浮動小数点型と大きな構造体型を返すためのサポートを追加したいと考えています。浮動小数点は難しくありません。でディスパッチされたメッセージを処理するために、単純に double を返す別の IMP を作成しますobjc_msgSend_fpret

問題は、どうするかですobjc_msgSend_stret。可能性のある構造体の戻り値の型ごとに個別IMPに記述することは、次の 2 つの理由から非現実的です。1 つ目は、コンパイル時に既知の構造体の型に対してのみ記述したとしても、それはばかげた数の関数になるためです。次に、任意の Objective-C および Perl コードに対してリンクできるフレームワークについて話しているため、フレームワークがコンパイルされているときに、すべての潜在的な構造体型を把握しているわけではありません。

私がやりたいことは、IMP経由でディスパッチされた戻り値の型を処理できるシングルを書くことobjc_msgSend_stretです。古いが宣言されたように、 returnとして記述voidし、リターン バッファーへのポインター引数を取ることができますか? objc_msgSend_stretそれがたまたま今のところうまくいったとしても、今後もうまくいくと期待できますか?

アドバイスをありがとう-私はこれについて頭を悩ませてきました。:-)

アップデート:

以下は、Apple のランタイム エンジニアの 1 人から、objc-language メーリング リストで受け取ったアドバイスです。

このケースを処理するには、アセンブリ コードを記述する必要があります。

あなたの提案は、「最初の引数として構造体へのポインターを使用して void を返す関数」の ABI が「構造体を返す関数」と異なる一部のアーキテクチャでは失敗します。(i386 では、構造体アドレスは、ある場合には呼び出し元によって、別の場合には呼び出し先によってスタックからポップされます。) のプロトタイプ objc_msgSend_stretが変更されたのはそのためです。

アセンブリ コードは、構造体の戻りアドレスをキャプチャし、残りのパラメーターを乱すことなく非構造体の戻り値の C 関数呼び出しに密輸し、終了ret $4 時に (i386 で) 適切な ABI 固有のクリーンアップを実行します。または、アセンブリ コードですべてのパラメーターを取得することもできます。転送機構は次のようなことを行います。手法がどのように見えるかを確認したい場合は、そのコードがオープンソースの CoreFoundation に含まれている可能性があります。

誰かがより良いアイデアをブレインストーミングする場合に備えて、この質問は開いたままにしますが、これは Apple 自身の「ランタイム ラングラー」から直接得られたものであり、おそらく私が得る可能性が高いのと同じくらい信頼できる答えだと思います. x86 のリファレンス マニュアルのほこりを払い、アセンブラの錆を落とす時が来たと思います...

0 投票する
1 に答える
1657 参照

objective-c - Objective C:構造や組合ではないものでのメンバーXXXのリクエスト

次のコード(スニペット)を実行しようとすると、エラー(件名に記載)が発生しました。エラーは、以下のコードの3行目と4行目を指しています。

この一連のコードの前に、ShapeColorとShapeBoundaryの列挙型と構造体を次のように定義しました。

また、インターフェイスと「Circle」クラスの実装を定義しました

@propertyと@synthesizeを使用して、「fillColor」と「Shapebounds」のゲッターメソッドとセッターメソッドを定義しました。プロパティと合成を使用してサブジェクトにエラーを発生させる方法に問題がありますか?これに関するアドバイスは大歓迎です。

よろしくお願いします

ジェンホー

0 投票する
1 に答える
490 参照

objective-c - ObjC クラス ランタイム プロセス + 初期化の問題?

客観的なCオブジェクトのランタイムプロセスを理解しようとしているすべて

Object Refs から、オブジェクトの +Initialize メソッドは、最初に呼び出されたメソッドを取得したときに呼び出されます。以下のようにテストファイルを実行します。なぜこれらのオブジェクトが +load だけを呼び出したのか不思議です。

0 投票する
1 に答える
4186 参照

objective-c - dealloc で self.property = nil を使用しても問題はありませんか?

宣言されたプロパティがアクセサメソッドを生成することは知っていますが、これはどういうわけか単なる構文糖衣です。

self.property = nil多くの人が彼らのdealloc方法で使用していることがわかりました。

1) Apple のメモリ管理ドキュメント、p23 には次のように書かれています。

アクセサー メソッドを使用してインスタンス変数を設定してはならない唯一の場所は、init メソッドと dealloc です。

なぜすべきではないのですか?

2) Apple のObjective-C 2.0 では、p74

宣言されたプロパティは、基本的にアクセサ メソッドの宣言に取って代わります。プロパティを合成すると、コンパイラは存在しないアクセサー メソッドのみを作成します。メソッドとの直接的なやり取りはあり dealloc ません。プロパティは自動的に解放されません。ただし、宣言されたプロパティは、メソッドの実装をクロスチェックする便利な方法を提供 dealloc します。ヘッダー ファイル内のすべてのプロパティ宣言を検索し、マークされていないオブジェクト プロパティ assign が解放され、 マークされているオブジェクト プロパティが解放されていないことを確認できますassign 。

注: 通常、メソッドでは、次の例に示すように、(set アクセサーを呼び出してパラメーターとして渡すのではなく) インスタンス変数を直接オブジェクトdealloc化する必要があります。releasenil

ただし、最新のランタイムを使用してインスタンス変数を合成している場合は、インスタンス変数に直接アクセスできないため、アクセサー メソッドを呼び出す必要があります。

メモの意味は?

私は見つけ[property release];て、[self setProperty:nil];両方とも動作します。

0 投票する
3 に答える
3444 参照

cocoa - Objective-C オブジェクトを動的に割り当てる必要があるのはなぜですか?

Objective-c オブジェクトを動的に割り当てる必要があるのはなぜですか? スタック上に作成できる C++ とは異なり、オブジェクトへのポインターにする必要があるのはなぜですか? ありがとう。

0 投票する
1 に答える
2360 参照

cocoa - NSButtonで実行時に軸を個別にスケーリングする方法

Interface Builderでは、ボタンの画像をどのように拡大縮小するかを選択できます。[拡大縮小]ドロップダウンには、[軸に依存しない]、[比例的に縮小]などを選択します。実行時にNSButtonのこの属性にアクセスまたは変更するにはどうすればよいですか?