問題タブ [ivar]
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 - Objective-Cでivarを使用する必要がありますか?
@propertiesのみを使用するアプリケーションを作成しています。どのクラスファイルでも、1つのivarがまったく宣言されていません。私が理解しているように、@ propertyの導入により、ivarは不要になりました。ベストプラクティスに従ってコーディングしていますか?これは長期的にはことわざのお尻に私を噛むことになりますか?私は「正しい」と「間違っている」についての混合レビューを読んでいます...
objective-c - なぜ ivar を使用するのでしょうか。
私は通常、この質問が別の方法で尋ねられるのを目にします。たとえば、すべての ivar はプロパティである必要がありますか? (そして、このQに対するbbumの答えが好きです)。
私は自分のコードでほぼ独占的にプロパティを使用しています。しかし、私は、長い間 iOS での開発を行ってきた伝統的なゲーム プログラマーである請負業者と一緒に仕事をすることがよくあります。彼は、プロパティをほとんど宣言せず、ivar に依存するコードを作成します。彼がこれを行っているのは、1.) Objective C 2.0 (2007 年 10 月) までプロパティが常に存在するとは限らなかったため、彼はそれに慣れていたからです。
彼はリークしないコードを書いていますが、ivar よりもプロパティを使用する方が好きです。私たちはそれについて話しましたが、彼は多かれ少なかれプロパティを使用する理由を理解していません。私たちは KVO を使用しておらず、彼はメモリの問題に対処した経験があるからです。
私の質問はもっとです...なぜあなたはivar期間を使いたいと思いますか-経験があるかどうか。ivar の使用が正当化されるほどの大きなパフォーマンスの違いは本当にありますか?
また、明確にするために、必要に応じてセッターとゲッターをオーバーライドし、ゲッター/セッター内でそのプロパティと相関する ivar を使用します。ただし、ゲッター/セッターまたは init 以外では、常にself.myProperty
構文を使用します。
編集 1
すべての良い反応に感謝します。間違っているように思われることに対処したいのは、ivar を使用するとカプセル化が行われ、プロパティではカプセル化されないことです。クラス継続でプロパティを定義するだけです。これにより、部外者からプロパティが隠されます。次のように、インターフェイスでプロパティ readonly を宣言し、実装で readwrite として再定義することもできます。
クラスの継続にある:
完全に「プライベート」にするには、クラスの継続で宣言するだけです。
uiviewcontroller - 変数をインスタンス化するかどうか... dealloc の問題
そのため、私の ARC プロジェクトでは、インスタンス変数を使用して ViewController を割り当てるたびに、コントローラーを閉じたりポップしたりするときに dealloc が呼び出されないように見えます。
私のヘッダーで:
...
...
次に私のコードで:
ここで、composeView 内ですべてのデリゲートを nil に設定しましたが、dealloc が呼び出されることはなく、その後、ビュー コントローラーをリロードするときに viewDidLoad が再度呼び出されることはありません。
インスタンス変数を使用せず、直接作成するだけであれば、すべて問題ありません。どんな助けでも大歓迎です、ありがとう!
rspec - 非コントローラ テストで rspec のインスタンス変数をスタブすることは可能ですか?
通常はコントローラーにインスタンス変数を設定しますが、コントローラーに設定されたインスタンス変数の値に依存するモデル メソッドの単体テストを行っています。
rspec を使用して、テスト用にこのインスタンス変数をスタブまたは設定することは可能ですか?
これまで見てきたことはすべて、モデル テストではなく、コントローラーまたはビュー テストからのみインスタンス変数をスタブ/設定できるように思われます。
objective-c - 効率のためにクラス外からの直接ivarアクセスを使用することは許容されますか?
クラスの外部からivarにアクセスするためのプロパティを使用してクラスを定義できます。
myInst-> ivar構文を使用して、C構造体でアクセスすることもできます。
C ++ではアクセサーを使用しますが、Objective-Cでは直接アクセスしたい場合があります。メッセージはC++メソッドの場合のようにインライン化されていないため、メッセージングシステムでは、一部のコンテキストで重要なアクセサーで大きなパフォーマンスヒットが発生します。
たとえば、スカラーと呼ばれるivarとそれに定義されたプロパティを持つクラスで。スカラーは単純なfloat値です。
[myinstscalar]をmyinst->scalarに変更すると、アクセサーで呼び出しを使用するとこのループでCPUの大部分が使用されるため、メソッドの実行速度が大幅に向上します。
C ++と同様に、ivarへの直接アクセスは一般的に推奨されていないことを理解していますが、このコンテキストでは、速度が重要な場合、それは許容されますか?そうでない場合でも、objective-cクラスを使用するより好ましいメソッドはありますか?
objective-c - Objective c での iVar プロパティの公開/合成
基本的に、別のクラスの軽量ラッパー クラスとして機能するクラスがあります。その他のクラスを iVar として保持します。iVar の特定のプロパティ (実際にはかなりの数) を公開できるようにしたいのですが、そのためには、次のように各プロパティ アクセサーを書き出す必要があります。
もちろん、すべてのプロパティに対してこれを行う必要がありますが、これは面倒です (約 30 のプロパティがあります)。これを合成したいのですが、方法がわかりません。
合成は可能ですか?
また、サブクラス化はできません....まあ、できるかもしれませんが、実際にはお勧めしません。iVar クラスは非常に重いです (CoreText を実装しています)。私はむしろ手でメソッドを書きたいと思います。
objective-c - すべての iVar のプロパティを作成することは必要ですか、それとも良い習慣ですか?
ivar がクラス内でグローバルに使用されるが、他のクラスからアクセスされない場合でも、プロパティを使用する必要がありますか?
objective-c - cocos2d クラスと ivar
私は、インスタンス変数 (または ivar) がクラス名である場合に何を達成しようとしているのかについて非常に不安定です。これが基本的な Objective-C の原則であることはわかっていますが、cocos2d を使用するときに関連性を持たせたいと考えています。
たとえば、このインターフェイスでは次のようになります。
CCSpriteSheet クラス (現在は CCSpriteBatchNode に更新されていますが、これはエンジンの古い v です) には、BulletCache のインスタンス変数であるインスタンスがあります。
しかし、これは正確にはどういう意味ですか?BulletCache で以前はできなかったことができるようになるのは何ですか?
objective-c - ivarsが期待どおりに動作しない
私は最近、ViewControllersのプロパティだけでなくivarを宣言する必要がなくなったという投稿を読み、重複する宣言をコードから削除していることに気づきました。
私が気付いた本当に不可解な効果は、プロパティに宣言されたivarがない場合、その前に次のようにする必要があるということself.
です。
CustomVC.h:
CustomVC.m:
なしで変数にアクセスする際に問題が発生した場合はself.
、コンパイル時または実行時エラーが発生すると予想されますが、黙って失敗するようで、デバッグが困難になります。
cocoa - Macアプリのリリースでivarを明示的に宣言しないようにするにはどうすればよいですか?
iOS 4.0以降、ivarを明示的に宣言する必要がないことを私は知っています。タイピングが少ないので、これは私@synthesize myVar = _myVar;
にぴったりですが、これがなぜ、どの設定から来ているのかはよくわかりません。私は自分のMacアプリで同じことをしようとしていました。デバッグモードでビルドしている間は機能しましたが、アーカイブの作成に切り替えると、コンパイラが文句を言い始めました。これを抑制する方法はありますか?