問題タブ [designated-initializer]
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.
objective-c - 指定された初期化子と引き渡し引数
私はこの階層を持っています:
CreateAnObjectClass で MySecondClass メソッドのインスタンスを作成し、myBaseClass に a を渡したいと考えてい@property (strong,nonatomic) NSDictionary* myTemplate
ます。
例えば:
そして、MyBaseClass と MySecondClass から両方の初期化子を呼び出すことを知っています。
私の質問は、myTamplate の初期化子を MyBaseClass のプロパティにする方法を設計する方法ですか?
ios - フレームの高さと幅を設定するための loadNibNamed と initWithFrame のジレンマ
.xib ファイルに関連付けられた UIView サブクラスを作成しました。この UIView サブクラスは、UIViewController で使用されます。コントローラーでは、UIView サブクラスをインスタンス化する方法が 2 つあります。
と
私は、カスタム初期化を実行できる最初のアプローチまたはその変形を好みます。唯一の問題は、既に で指定されているフレームの rect を指定する必要があることです。xib
(フレームの高さと幅を意味しますMyUIView
)。はい、もう一度ハードコーディングできますaRect
が、これは維持するのが面倒です (たとえば、.xib で UI の位置を変更するとaRect
、 も更新する必要があります)。
したがって、フレーム四角形が自動的に設定されるため、2 番目のアプローチを念頭に置く必要があります。残りの問題は、イニシャライザをカスタマイズできないことです (たとえば、初期化中に追加のパラメータを渡したいなど)。
あなたの好みは何ですか?あなたの意見では、どちらが優れていますか?
EDIT1:セルジオの答えに触発されて、私はこの回避策を思いつきました:
objective-c - 指定された初期化子でインスタンス オブジェクトを初期化しますか?
幅と高さのプロパティを持つ Rectangle クラスがあります。Origin (-(XYPoint *) origin )と呼ばれるインスタンス プロパティ/オブジェクトもあります。以下は、XYPoint オブジェクトを引数として渡す指定イニシャライザーのコードです。このメソッドで XYPoint クラスのプロパティを引数として取得し、XYPoint オブジェクトを初期化してメソッド内でメモリを割り当てる方法はありますか (または問題ありませんか)。それ以外の場合は、メイン プログラムで XYPoint オブジェクトを作成し、それを引数として渡す必要があります。これは、より多くのコードを入力する必要があります。
PS-私はプログラミングとObjective Cが初めてなので、質問で技術的に間違ったことを述べた場合はご容赦ください。ありがとう!
objective-c - Objective-C では、指定された初期化子が常に呼び出されるという規則は常に守られているわけではありませんか?
Objective-C では、クラスの指定された初期化子が常に確実に呼び出されるという規則があるという事実を信頼できますか? それとも、いくつかの例外を除いて、ほぼ常に正しいと言えるでしょうか? たとえばUIView
、ドキュメントには次のように記載されています。
initWithFrame:
プログラムでビュー オブジェクトを作成する場合、このメソッドは UIView クラスの指定された初期化子です。サブクラスは、このメソッドをオーバーライドしてカスタム初期化を実行できますが、実装の最初に super を呼び出す必要があります。
Interface Builder を使用してインターフェイスを設計する場合、ビュー オブジェクトが後で nib ファイルから読み込まれるときに、このメソッドは呼び出されません。nib ファイル内のオブジェクトは再構成され、initWithCoder: メソッドを使用して初期化されます。
または、プログラムによる場合、ルールは常に適切に設計されたクラスに適用されるべきであると言えますが、Interface Builder は、プログラム以外の方法でオブジェクトを一種の「復活」または構築するため、少し異なります。もしそうなら、私たちが iOS プログラミングを行うとき、それらは一般的に他の例外ですか?
c - C99 での C 構造体の初期化 - 名前付きメンバーと名前なしメンバーの混合は有効ですか?
以下を考えると:
次のイニシャライザ構文は C99 で有効ですか?
構文例 #1
構文例 #2
私は単純な構造体パーサーを作成していますが、私のテストでは、XCode 4.2 を使用してもコンパイラ エラーは発生しません。パーサーを C99 準拠にしたいと考えています。私の理解 (標準参照なし) では、構造体初期化子には、すべての名前なしまたは名前付き (つまり、指定された) メンバーが必要です。
構文例 #1 と #2 はコンパイラ エラーでしょうか?
例が有効な場合、初期化構文のルールは何ですか?
更新された質問の例
同じ主要な質問で、例 3 はどのように機能しますか? 私は主に、指定された初期化子と標準の初期化子の任意の順序について混乱しています。
objective-c - Objective-C クラスには、指定された初期化子が 1 つだけ必要ですか?
このAppleのドキュメントで指定された初期化子の情報を見つけましたが、理解できないのは、各クラスには指定された初期化子が1つだけ必要ですか?
たとえば、class A
has initL, initM, initN
、 while class B
inherits fromclass A
および hasの場合はどうなるでしょうかinitX, initY, initZ
。initX
call [super initL]
、およびinitY
call [super initM]
、およびinitZ
callを使用できないというルールはあります[super initN]
か?
つまり、すべての「二次初期化子」が指定された初期化子を呼び出す代わりに、各指定された初期化子がスーパークラスの指定された初期化子である[super initFoo]
場所を呼び出します。 initFoo
? (そして、これらはすべて から継承されNSObject
、 を呼び出すだけself = [super init]
です。)
ios - (iOS) UIViewController のカスタム初期化時に黒い画面が表示される
これが私の最初の質問です。Core Audio で動作するアプリを作成しようとしています。使用しようとしているこのフレームワークhttp://theamazingaudioengine.com/を見つけましたが、これまでのところ、ファイルを再生するというドキュメントの最初のことを行うことができました。ただし、アプリのデリゲートで UIViewController をカスタム初期化すると、そのコンテンツがすべて失われ、View Controller が黒くなり、他の要素はなくなります。
私のUIViewControllerには、ファイルの再生を開始するために使用したいボタンが1つしかありませんが、現時点ではアクセスできないため、プロジェクトのビルド時にファイルの再生が開始されます。
私は何が間違っているのですか?
これは私の appDelegate です:
そして私のUIViewController:
c - C99 Designated Initializer 重複インデックスは、ビルド出力または lint でまったくフラグが立てられません
先日、指定されたイニシャライザを少しいじってみたところ、驚いたことに、同じインデックスを複数回使用することが有効であることに気付きました。さらに、コンパイラの警告、エラー、さらには情報ステートメントさえ生成しませんでした。PC-Lint でさえ気にしていないようでした (これが一番驚いたと思います)。
この場合、コンパイラが情報メッセージを提供しない理由があるのか 、それとも追加のコンパイラ/リント/などがあるのか 疑問に思っています。これをキャッチまたはフラグするために使用できるオプション。
使用ツール: Renesas RX Standard Toolchain v1.2.0.0 (C99)、gcc バージョン 4.4.3 (Ubuntu 4.4.3-4ubuntu5.1) (VM 内)、Lint-NT 9.00i
たとえば、私が取り組んでいるいくつかの古いコードは、一連のコマンドを #defines し、コマンド構造の配列 (ここでは大幅に簡略化) を作成して、その特定のコマンドを見つけて使用するために循環します。
次に、どこかで見た指定された初期化子の構文を思い出し、重複したコマンド インデックスを検出することに加えて、配列内の項目の配置をより柔軟にできると考えました。
上記の最初のコードと同じ効果が得られますが、配列宣言内の項目を柔軟に配置できます (そうです)。
同じ指定されたインデックスを複数回使用しているため、少なくとも警告が生成されます (そうではありません) (この例は、最後の NULL プレースホルダーをシフトせずにコマンドを追加すると簡単に発生する可能性があります)。
GCC Designated Initsページには、イニシャライザで範囲を使用できるようにする GNU 拡張機能が記載されています。これは、範囲全体を定義してから特定の部分をオーバーライドする機能で役立つことがわかります (たとえば、int arr[] = {[0 ... 99] = -1, [42] = 1}
なぜそれがまだなのかわかりません少なくともあるレベルではフラグが立てられていません...
同じ GCC ページのさらに下では、複数のフィールドのトピックに対処していますが、そのように動作する理由については説明していません。このようなオーバーライドされた初期化には副作用があり、副作用が発生するかどうかは不明です。現在、GCC はそれらを破棄し、警告を発行します。」
This IBM pageも興味深い例を示していますが、それでも(少なくとも私にとっては)なぜそれが少なくともある種のビルドメッセージではないのかについては答えていません...
最後に、この2000 年 12 月のgcc パッチ ページでは、重複したチェックが明示的に削除されたことを示していますが、(私が簡単に読んだ内容から) 理由を説明していません。
では、なぜこれが (一見) 見過ごされているのでしょうか? そして、コンパイラ(またはリント)にこれにフラグを付ける方法はありますか(安全性を高めるために)(c/c99では、「c ++を使用する」などとだけ言わないでください:p)?