問題タブ [unsafe-unretained]
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 - Should I use __unsafe_unretained for temp variables?
Let's say I want to create a temporary variable, e.g.:
To point to another long-living variable:
/li>To point to an object I just created.
/li>
These temporary variables don't need to be retained because the objects they point to are guaranteed to keep positive retain counts for as long as the temporary variables are in scope. So, should I declare them as __unsafe_unretained
?
objective-c - unsafe_unretained ivars /プロパティを管理する方法は?
私は数週間前にobjective-cとiOSを開始しました(覚えておく価値があります)、そしてひどい図を前もってお詫びします!!
上の図は、Webサービスへの呼び出しの構造を示しています。細い矢印は、別のオブジェクトを作成するオブジェクトを示し、太い矢印は、ポイントされたオブジェクトへの強い(保持された)参照を保持しているオブジェクトを示します。
これにはいわゆる「循環参照」が含まれており、オブジェクトの割り当てを解除する際に問題が発生すると思います。
私のプロジェクトがiOS3.2もターゲットにしていることを除いて、簡単な答えは弱いものへの強い参照のいくつかを置き換えることであることを理解しています(私の決定ではありません-この事実を実際に変更することはできません!) 。したがって、代わりに__unsafe_unretainedを使用する必要があると言っているのは正しいと思いますが、オブジェクトの割り当てが解除されるとEXC_BAD_ACCESSの問題が発生するため、これらが自動ゼロ化されないという事実についてはかなり心配しています。 ..
したがって、私の問題は、最初に循環参照があることです。解決するには、__ unsafe_unretainedを使用する必要があります。これは、2番目の問題につながります。これらを正しく管理するにはどうすればよいですか。
関連する可能性のある質問は次のとおりです。NSURLConnectionはその強力な参照をどのように管理しますか?さまざまな情報源から、代理人を保持していると聞いたことがありますか?したがって...NSURLConnectionを保持し(そしてそのデリゲートでもあり)、それが私を保持している場合、これも循環参照になりますね?それは私の問題をどのように回避しますか?
どんなアドバイスも大歓迎です!
よろしく、ニック
objective-c - 二重間接ポインタ割り当てを使用してプロジェクトを ARC に変換する
プロジェクトを ARC に変換しようとしています。このプロジェクトには、有向非巡回ワード グラフがあります。これは、基本的に、あらゆる場所に二重間接ポインターがたくさんあることを意味します。
これは ARC への変換が非常に困難であることを証明しており、特に 1 つの問題が現在私を困惑させています。
これがシナリオです。
あなたが持っているとしましょうNSString *
:
二重間接型もあります。
次のように、一方を他方に割り当てます。
これにより、変換エラーが発生します。
に変更b
してもうまくいき__unsafe_unretained
ません。また、さまざまなブリッジ キャストも試しました。ここで明らかな何かが欠けていますか?
何か案は?
ありがとう!
objective-c - ObjC自動参照カウント(ARC):弱いvs割り当てvsデリゲートのunsafe_unretained?
私はクラスを持っています:
そして実装:
ARC のコードをリファクタリングすると、「弱い」プロパティの合成は ARC/GC モードでのみ許可されていることがわかります。しかし、私が知っていることから、デリゲートはARCで「弱い」可能性があります。また、割り当てに変更すると、unsafe_unretainedに変換されます。
私の質問は、(ARC への) 変換前のコードが ARC を使用してはならないということですか?
ありがとう!
ios4 - ARC にアップグレードしてからのデリゲート ポインターの問題
アプリケーションを ARC にアップグレードしたところですが、デリゲートを持つクラスの処理方法に問題があります。私は iOS 4.0 以降をターゲットにしているので、デリゲート ポインターを格納するために__unsafe_unretained
andを使用しています。@property (unsafe_unretained)
しかし、私が今見つけているのは、ビューコントローラーで作成したサービス (デリゲートを含む) が、そのビューコントローラーを削除した後、ぶらぶらしているということです。その結果、ビューコントローラー (デリゲート) と通信しようとします。の割り当てが解除されました...したがって、ゾンビが有効になっているとエラーが発生します。
ビュー コントローラーまたはサービスのコードを更新して、ビュー コントローラーが削除された (ナビゲーション コントローラー スタックからポップされた) ときに、デリゲート ポインターを持つサービスもメモリから削除されるようにするにはどうすればよいですか?
objective-c - iOS 4.3をサポートするには、weakの代わりに「assign」を使用しますが、Interface Builderはunsafe_unretained?を使用します。
ARCでiOS4.3をサポートするには、次を使用するのが適切な方法だと思いますassign
。
あれは正しいですか?ARCへの移行に関するAppleのドキュメントにも次の内容があります。
宣言されたプロパティには、weakではなくassignを使用する必要があります。変数については、__weakの代わりに__unsafe_unretainedを使用する必要があります。
ただし、現在のXcode(4.4.1)を使用し、シングルビューアプリのターゲットを4.3に変更し、Ctrlキーを押しながらUIButtonを.h
ファイルにドラッグしてアウトレットを作成すると、生成されるコードは次のようになります。
なぜ違いがあり、どちらを使用する必要がありますか?
objective-c - Objective Cで解放されたオブジェクトへの__unsafe_unretainedポインターを返すと、クラッシュが発生します
問題:
__unsafe_unretained id
すでにリリースされているオブジェクトを指すポインタがあります。これまでのところ、ポインターをまったく「使用」しない限り(特に、ポインターを介してメソッドを呼び出さない限り)、問題はありません。ただし、メソッドからその値を返そうとすると、戻り値の型が。であることを明示的に指定した場合でも、クラッシュ__unsafe_unretained id
します。何故ですか?を使用すると、 //__unsafe_unretained
のようなメソッドはまったく呼び出されないと思いましたか?私はそれが(単純なネイティブの割り当てのみを行うことを意味する)であるかのようにほとんど使用できると思いましたか?retain
release
autorelease
__unsafe_unretained id
void*
環境:
- で開発
Xcode 4.4.1
- 使用する
iOS SDK 5.1
ARC
はenabled
iPhone 4.3 / 5.0 / 5.1 Simulator
またはで実行iPhone 4.3 Device
- 両方でクラッシュし
Debug
、Release
ビルドします
ソースコード:
コールスタック(iPhone 4.3 Simulator / iOS 4.3デバイス):
コールスタック(iPhone 5.0 / 5.1シミュレーター):
objective-c - 弱いプロパティがないIOS 4.0にARCを使用するのは本当に良いオプションですか
私はARCベースのプロジェクトに取り組んでいます。私のプロジェクトは、IOS 4.3 を対象としています。バージョン < IOS 5.0 にはウィーク ポインターがないため、unsafe_unretained
ダングリング ポインターが発生する可能性があるものを使用する必要があります。
unsafe_unretained で ARC を使用するのは本当に良いオプションでしょうか? それとも、私のプロジェクトは IOS 4.3 をターゲットにしているので、手動のメモリ管理に戻す必要がありますか?
私の場合に ARC を使用するのが適切なオプションである場合、unsafe_unretained プロパティをどこで nil に設定する必要がありますか? viewDidUnload で実行している人を見たことがありますが、通常のシナリオでは viewDidUnload が呼び出されることはありません。どんな助けでも大歓迎です。
objective-c - NSStrings へのポインタの 2 次元配列を指す ivar のプロパティ
NSStrings へのポインターの動的な 2 次元 C 配列を含むクラスを作成したいと考えています。複数の NSArray を含む NSArray を使用して 2 次元配列をシミュレートできることはわかっていますが、可能であれば、従来の 2 次元 c-array を使用してこれを実行したいと考えています。ARC は、「__unsafe_unretained」を使用しない限り、NSString へのポインターを c-array の要素に単純に割り当てることを許可しません。
メモリ リークを回避し、c-array に割り当てられた各 NSString のクラス所有権をオブジェクトに与えるために、各 NSString オブジェクトへのポインターを NSMutableArray に追加します。-(void)dealloc では、取得したメモリを解放して、2 次元の c-array を作成します。
これが私の質問です: _array ivar に基づいてプロパティを宣言し、配列の i,j 要素を "foobar->array[i" ではなく "foobar.array[i][j]" として参照するにはどうすればよいですか? ][j]"?
後の増幅: __bridgeのものを除いて、回答者と非常によく似た方法でそれを行いました。それが違いを生むかどうかはわかりません。ここで 2 次元配列を割り当てます。
コンマ区切り値のファイルから生成された部分文字列を使用して、NSString オブジェクトへのポインターを配列に入れます。
-(void)dealloc で、すべてのメモリを解放します。
ios - __unsafe_unretained 型キャストによる malloc オブジェクトの有効期間
私は Objective-C と ARC を初めて使用し、答えが見つからないまま何時間も検索して読んでいます。コードは私がやりたいことを実行しますが、好ましい条件に依存していないことを知りたいです。これが私のコードの簡略版です:
割り当てている構造については、あまりできません。objc_getClassListによって埋められます。残念ながら、Apple はドキュメントを更新して、ARC でこれを行う方法を説明していないようです。上記の型キャストは、例を見て部分的に考え出されたものですが、それでも私は緊張します。
私の懸念の 1 つは、「通常の」オブジェクトにスペースを割り当てdealloc
た場合、変数がスコープ外になったときに呼び出され、それfree
が呼び出された後に発生することです。しかし、それがまさにここで起こっていることだとは思いません。
Class
他の種類の Objective-C データ型とは動作が異なりますか? 私はそれから何か他のものを期待すべきですか?- ポインタとは
classes
何ですか?不明なサイズの配列 (非オブジェクト ポインター) を参照していると思いますが、そのキャストなしではコードがコンパイルされないため、ARC は依然としてそれを気にかけています。強力なポインタのように見えますが、何が強力なポインタになるのかわかりません。 - 配列内のオブジェクトへの強いポインタはありますか?それとも、オブジェクト自体が強いポインタですか? そうでない場合、ARC は引き続き機能しますか? それとも、いくつかの MRC 規則に戻す必要がありますか?
- への自動呼び出しはあり
dealloc
ますか? コンパイラは、いつ、どのようにしてそれが起こることを保証できますか? classes
に設定してからNULL
呼び出しを行う方が良い方法free
ですか? または、配列を反復処理して、オブジェクトを に設定するなど、すべてのオブジェクトについて何かを行う必要がありますnil
か?