問題タブ [class-extensions]
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 - リンカがそこにあるはずのクラスを見つけることができません
Core Telephony フレームワークを使用するプロジェクトがあります。最近、コードがカテゴリで動作しなくなりました。リンカーは、クラスCTCarrier
が見つからないと文句を言います。CTCarrier
これは、上記のエラーをトリガーするサンプル コードです。
カテゴリをクラス拡張に変更すると、コードが突然ビルドされます。
どうしたの?GitHubのサンプル コード。
objective-c - クラス拡張で新しいプロパティを宣言するのはObjective-Cの悪い習慣ですか?
クラス拡張の大きな利点の 1 つは、クラス拡張を使用すると、ヘッダー ファイルで読み取り専用プロパティを宣言し、クラス拡張でこのプロパティを readwrite プロパティとしてオーバーライドできることです。以下のように:
ただし、最新のランタイムを使用する場合は、クラス拡張でまったく新しいプロパティを宣言することもできます (存在しない場合は、そのプロパティの iVar も生成します)。
これが私の質問です。クラス拡張でまったく新しいプロパティを宣言すると、どういうわけか副作用があると思います。クラス拡張はヘッダー ファイルにない可能性があり、クラスをサブクラス化する他の誰かがその「秘密のプロパティ」について知らない可能性があるためです。そして、彼がその「秘密のプロパティ」と同じ名前のプロパティを宣言した場合。そして、この新しいプロパティの getter メソッドと setter メソッドは、スーパー クラスのメソッドをオーバーライドします。これは問題ではありませんか?そして、なぜ現代のランタイムはそのようなことが起こるのを許すのでしょうか?
編集 このトピックについて別の質問を投稿しました。チェックしてください: クラス拡張 (Ojbective-C) で新しいプロパティを宣言するリスク、解決方法は?
objective-c - クラスインターフェイスのivarと、宣言されたプロパティ(モダンランタイム)によって作成されたものとの間に違いはありますか?
現代のランタイムでは。次のようなインターフェイスでivarがすでに宣言されていなくても、プロパティを宣言できます。
self.str1
そして、私は知っています、実装では、両方または純粋にアクセスできるので、これは自動的にstr1ivarを生成しますstr1
。
しかし、私の質問は、str1とstr2の間に違いはありますか?
それらが同じである場合、クラス拡張(名前のないカテゴリ)がivarを生成するが、クラス拡張にivarインスタンスを追加することを許可しない新しい宣言されたプロパティを追加できるのはなぜですか?(LLVM2.0以降では許可されています)これですが、gccはしません)
c# - 異なるアセンブリが存在する場合の部分的/拡張クラスまたはインターフェイス
メソッドを使用して例外を処理します。内部的にはデータベースに書き込みますが、Web にリリースすると、ソース コードにはデータベースへの書き込みに必要な接続文字列が含まれません。代わりに、ログ ファイルに書き込む必要があります。
Foo.Private.dll が存在しない場合はログへの書き込みに対応できますが、存在する場合はデータベースに書き込みますか?
...
両方のログ クラスに共有インターフェイスを実装し (拡張およびオーバーライドする代わりに)、それをレンダリングするファクトリ メソッドを作成することを検討しましたが、アセンブリの存在を検証する方法や、参照を追加せずにその型を使用する方法がわかりません。最終プロジェクトには循環参照があります。
objective-c - Objective-C:プライベートメソッドを宣言する必要がありますか?
Objective-Cでクラスのプライベートメソッドを定義する最良の方法に従って、クラス拡張でプライベートメソッドを宣言してきました。
しかし、Xcode 4では、プライベートメソッドの宣言を完全に省略して実装するだけで、アプリは警告やエラーなしでコンパイルおよび実行されることに気付きました。
それで、クラス拡張でプライベートメソッドを宣言することさえわざわざする必要がありますか?
とにかくメソッドを宣言する必要があるのはなぜですか?Javaでは、あなたはそうしません...Rubyでも。
xcode - Xcode コード補完でのクラス拡張のメソッドの可視性
Xcode 3.2 と Xcode 4 の間のコード補完の違いに対処する同様の質問を見ました。私の質問は、Xcode (3.2) の特定の動作に対応しています。
クラス拡張で「プライベート」メソッドを宣言すると、これらのメソッドはコード補完リストに表示されますが、表示されるべきではありません。
例 (AClass.m):
AClass.h を他のクラスにインポートして AClass インスタンスを作成すると...
Xcode のコード補完は、「プライベート」メソッド「someMethod」を示しています。
その時点で、このメソッドは、ヘッダー ファイルで定義されていないため、ここでは不明であるため、表示されるべきではありませんが、表示されます。その時点でメッセージ [test someMethod] を送信してビルドすると、期待どおりにオブジェクトが応答しない可能性があるという警告が表示されます。
実際には応答しますが、これは、特に私のクラスを使用したい他の誰かにとって、紛らわしい動作です。
これは @property / @synthesize にも影響します。これらは「メソッドを置き換えるだけ」だからです。私は、a) 同種コードを持ち、b) ivar の使用に影響を与えることができる (遅延インスタンス化など) ために、プロパティによってすべてのプライベート ivar にアクセスしたいと考えています。一方、すべてのプライベートなものは、クラスを使いやすくするために、(コード補完で) 誰にも見えないようにする必要があります。
この動作を変更する方法はありますか?
Xcode 3.2 でコンテキストの検証が欠落していることが理由ですか?コード補完でこの種のメソッドが表示されるべきではないのに、なぜ表示されないのでしょうか?
その動作は Xcode 4 で異なりますか (コンテキスト検証のため)?
Xcode 4に切り替えて適応する前にプロジェクトを完了したかったので、私はまだXcode 3.2を使用しています.
objective-c - Objective-C での選択的可視性のためのクラス拡張の使用
クラス拡張機能を独自の.h
ファイルに配置#import
し、クラスのメソッドとプロパティのさまざまなレベルの可視性を選択的に取得することは意味がありますか? これが悪い考えである (またはうまくいかない) 場合、その理由は何ですか?
objective-c - クラスの拡張とクラスのカテゴリ
クラス拡張機能@interface Class ()
はより強力で、変数をクラスに挿入できます。カテゴリ@interface Class (Category)
はできません。
他にどのような違いがありますか? クラス拡張よりもカテゴリを使用する必要があるのはいつですか?