問題タブ [reactive-cocoa]
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 の 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
objective-c - オブジェクトの NSArray の RACSignal
ViewController に ViewModel オブジェクトの NSArray があります。
@property (非アトミック、強力) NSArray *viewModels;
ViewModel オブジェクトは次のようになります。
RACCommand の init メソッドで enabledSignal の RACSignal を作成しようとしています。
このシグナルは、選択された viewModel オブジェクトが 0 であるか、選択された viewModel の数が viewModel の総数と等しい場合に有効になるように Command に指示します。
このコードで選択された viewModel オブジェクトを提供する RACSequence を作成できます。
有効な信号を作成するにはどうすればよいですか?
objective-c - ReactiveCocoa: subscribeNext: ブロックの状態を削除
VC に次のコードがあります。
yContentOffset
削除しようとしている VC のプロパティはどこにありますか。(検索モードに入る前にコンテンツ オフセットを保存し、後で復元します)。
試してみまし[RACSignal if: then: else:]
たが、完全には取得できませんでした。
reactive-cocoa - ReactiveCocoa の Kiwi テストでは EXC_BAD_ACCESS が生成されます
Kiwi フレームワークで ReactiveCocoa コードをテストしようとしています。
コードは次のとおりです。
ここにテストケースがあります
テスト ケースを実行するたびに、オブザーバーを追加しようとすると、RACKVOTrampoline クラスで EXC_BAD_ACCESS が発生します。
助言がありますか?
製品コードは ReactiveCocoa で問題なく動作します。
ios - ReactiveCocoaで複数のプロパティに影響を与える方法は?
で複数のプロパティに影響を与え、コマンドをアクティブにしたいと思いますUIButton
。
これを行う最善の方法について推論しようとしていますが、いくつかの入力を使用できます。
ここに私が持っているものがあります:
これは機能しますが、推奨事項を聞きたいです。
ios - ReactiveCocoa の使用中にエラー ブロックが呼び出されない
何らかの理由で、エラー メッセージが表示されません。(要点をわかりやすくするために、ここではコードを単純化しました。)
これは「B」を出力します。理由はありますか?サブスクライバーで呼び出された場合-sendError:
、完了ブロックがそれを受け取るのはなぜですか?