問題タブ [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.
iphone - theos/logos でカスタム プロパティを作成するにはどうすればよいですか?
theos/logos を使用して、フックされたメソッドでカスタム プロパティを作成することはできますか?
例:
上記の例のように試しましたが、成功しませんでした。
ios - iVar なしでセグエ先にデータを渡す
ストーリーボードに切り替えてから、ビューコントローラーを次の方法でロードします
これは完全に機能します。ここで、宛先ビュー コントローラーにプロパティを設定する場合は、メソッドを実装し、prepareForSegue:sender:
設定する必要があるプロパティを設定します。すべてが問題なく期待どおりに機能します。
古いものよりもこのアプローチを使い始めて以来
特に、設定しようとしている値が単なる静的な値ではない場合、パラメーターを宛先ビューコントローラーに渡すのは少しハックだと感じました。
たとえば、サーバーからデータを取得するボタンがあるとします。データが返されると、新しいオブジェクトが作成され、このオブジェクトを表示する新しいビュー コントローラーが提示されます。これを行うために を呼び出しますperformSegueWithIdentifier:sender:
が、それで終わりです。オブジェクトの割り当てが解除され、存在しなくなりprepareForSegue:sender:
ました。インスタンス変数に格納しない限り、オブジェクトをメソッドに渡す方法がありません。
オブジェクトはこのアクションよりも長く続くことを意図しておらず、現在のビュー コントローラーの他のものとは何の関係もないため、これはかなり恐ろしいことです。
この状況では、新しいView Controllerでデータを簡単にリクエストできることは理解していますが、これは単なる例です。
私の質問は、それほどハッキーに感じずにこれを行う別の方法はありますか? このデータをインスタンス変数に格納せずに、宛先のビュー コントローラーに入れることはできますか?
古いアプローチを引き続き使用できることはわかっていますが、できればストーリーボードの方法を使い続けたいと思います。
ios - Apple コードの例、なぜ彼らはここで ivar に直接アクセスしているのですか?
MultipeerGroupChat の Apple サンプル アプリケーション (具体的には MainViewController.m) を見ると、次のようになります。
この例には、プロパティを割り当てる以下のコードが含まれています。
次に、viewDidLoad でそれらを初期化します。
ivar _transcripts と _imageNameIndex に直接割り当てている理由はありますか? init メソッドを使用していない限り、常にプロパティを使用して変数にアクセスすることが適切な規則であると考えました...実際、viewDidLoad メソッドのもう少し先で、作成者はプロパティを使用して他の変数を割り当てます。
Apple のサンプル コードは、過去に適切なコーディング手法から逸脱することがあったことを知っています。そのため、これは単にずさんなコーディングなのか、それとも非初期化メソッドでこれら 2 つの ivar に直接アクセスする正当な理由があるのか 疑問に思っています。
ios - BOOL を iVar または Property として宣言する最適な方法
次のような iVar とプロパティの違いに関するいくつかの質問を読みました:なぜ ivar を使用するのですか?
ios インターフェイス iVar とプロパティ
私が知りたいのは... UIViewController
(たとえば)複数のメソッドでアクセスする必要があるBOOLを作成している場合、これらを作成する最良の方法は何ですか?
現在、プロパティを作成しています。これは正常に動作し、期待どおりです。しかし、私が読んだり学んだりすると、iVar を作成する方がパフォーマンスが向上するようです。
お気に入り:
これはパフォーマンスの点で優れているでしょうか。一方の値を YES に設定すると、複数のメソッドがこの iVar にアクセスできますか?もう一方の値をチェックできますか?プロパティ アプローチでできるように?
objective-c - ARC: プロパティ vs ivar: コピー、弱い
ARC の時代に Property vs. ivar を読んだことから、プロパティの自動合成された関連インスタンス変数__strong
を直接取得または設定するときに ARC が所有権修飾子を使用するが、strong
カスタムゲッターまたはセッターを呼び出したり、KVO をトリガーしたりしないことを理解しています。
しかし、次のようにプロパティを宣言するとweak
:
自動合成された関連付けられたインスタンス変数は、
__weak
所有権修飾子を取得しますか?たとえば、私の実装ではwill
_delegate = delegate
(vs )self.delegate = delegate
__weak
資格に応じて課題を実施しますか?で宣言されたプロパティは
copy
どうですか?
objective-c - どちらが初期化されるか、プロパティまたはそのインスタンス変数
myPropertyName
クラスで definedというプロパティがあるとしますMyClassName
。この記事では、手動のメモリ管理を使用しています。
MyClassName.h
MyClassName.m
myPropertyName
宣言の場所、インスタンス変数との違いなどの使い方に戸惑います。たとえば、-(void)init
my class のカスタマイズされたメソッドなど、初期化コードのこれら 3 つのステートメントの違いは何ですかmyClassName
。
self.myPropertyName = [[[NSObject alloc] init] autorelease];
これはセッターを呼び出し
myPropertyName
ていますが、セッターで使用されているインスタンス変数の名前が何であるかはわかりmyPropertyName
ません. )?myPropertyName
_myPropertyName
myPropertyName = [[NSObject alloc] init];
これはプロパティのインスタンス変数を初期化します
myPropertyName
か? を持っていない場合@synthesize myPropertyName = _myPropertyName;
、プロパティのデフォルトのインスタンス変数は であると言われているため、間違っているでしょうか_myPropertyName
。_myPropertyName = [[NSObject alloc] init];
andを使用しても
_myPropertyName
、プロパティのインスタンス変数としてまだ宣言されていますか?myPropertyName
@synthesize myPropertyName;
@private NSObject* myPropertyName;
私の理解では、プロパティは単なる名前 ( などmyPropertyName
) であり、値の割り当てなど、コード内の実際の操作で使用されるようにカプセル化されたインスタンス変数が必要です。
objective-c - Objective-C の self->_ivar アクセスと明示的 vs 暗黙的 self->
一般的な問題
self->_ivar
今までは、は に等しいと思っていました_ivar
。今日、これが完全に真実ではないことがわかりました。
たとえば、次のコード スニペットを参照してください。
という名前のself
一部でオリジナルを隠したとしても、暗黙のivar構文は依然として「オリジナルの」自己を見つけますが、明らかにそうではありません。後者の場合、コンパイラは正しく不平を言いますNSInteger
self
_testIVar
self->_testIVar
メンバー参照型 'NSInteger' (別名 'long') はポインターではありません
ただし、最初のケースでは、それは機能します。
現実世界の問題
この例はかなり人工的に見えるかもしれませんが、まったくそうではありません。たとえば、ExtObjCプロジェクト ( ReactiveCocoaで使用) は、非常に便利な構文を定義することで、ブロック内 (@weakify(var)
および他のオブジェクト)@strongify(var)
を強くキャプチャするのを防ぐのに役立つ非常に便利self
な構文を定義しています (奇妙で面倒な構文を記述する必要は__weak typeof(self) weakSelf = self; [...] ^{ __strong typeof(self) strongSelf = weakSelf; [...] }
もうありません)。例えば:
とがない@weakify
と@strongify
、ブロックは への強い参照をキャプチャしself
ます。で@weakify
、@strongify
そうではありません。したがって、self
ブロックが実行されるまで、の割り当て解除は延期されません。ただし、主な利点は、「オリジナル」が隠されているため、 weakSelf
orstrongSelf
の代わりに使用することを覚えておく必要がないことです。self
self
これは非常に便利です。ExtObjC は、マクロを使用して次のようなものを生成することで@weakify
/を実装します。@strongify
self
への強い参照を実際に取得せずに使い続けることができるので、それはさらに良いことself
です。しかし、implicit-ivars-of-self-syntax を使用するとすぐに、「オリジナル」への強い参照self
が引き続きキャプチャされます。
その他
ブロックで ivar を使用する場合、確実に をキャプチャしていますself
。たとえば、次のスクリーンショットを参照してください
。
スクリーンショットのもう 1 つの興味深い点は、警告メッセージが
未使用の変数「自己」
そして下の行で
このブロックで「自己」を強くキャプチャすると、保持サイクルが発生する可能性があります
そのため、2つのバージョンがあると思いますself
:-)
質問
ここでの実際の質問は次のとおりです。正確には_testIVar
どういう意味ですか? 「元の」self
ポインタをどのように見つけるのですか?
明確にするために(私のスクリーンショットも参照してください):@MartinRが指摘したように(これは私もそう思います)、self
変更できず、暗黙的な自己ivarアクセスにのみ使用される特別なバージョンがあります。それはどこかに文書化されていますか?基本的に、暗黙の参照先はどこで定義されていself
ますか? たとえば Java と同じように動作するように見えますが ( を使用)、オーバーライドできない予約済みキーワードであるというthis
違いがあります。this
問題は、それを「修正」する方法でもありません。 /の例self->_testIVar
で私が望むのは、ただ書くだけです。/を使用することで、暗黙的に強力にキャプチャするという間違いを犯すことはできなくなりましたが、そうではないようです。@weakify
@strongify
@weakify
@strongify
self
ios - iVar 値の変更を通知する
iVar の値が変化したときに通知を受け取りたいと思っていました。セッターを呼び出さずに文字列の値を変更するとしたら、同じクラスでどのように知ることができるでしょうか。KVO とセッターのオーバーライドは、セッターの呼び出しのみで動作するためです。iVar ではありません。