問題タブ [retain]
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 クラス メソッドのオブジェクト保持動作
クラス メソッドに渡されたオブジェクトを保持および解放するためのベスト プラクティスは何ですか?
たとえば、次のように宣言された「クラス変数」があるとします。
...これを行うのは正しいことです:
...これには、呼び出し元が、途中で解放されないように、param でゼロ以外の保持カウントを維持する必要があるという欠点があります。あるいは、これを行うこともできます:
dealloc
...これには、対応するクラスレベルの呼び出しがないとメモリリークが発生するという欠点があります。それとも、この種のオブジェクトの有効期間をより従来の方法で管理するシングルトン クラスを使用して、この種のクラス変数ごまかしを完全に回避する必要がありますか?
シングルトン インスタンスの作成に関する Apple のドキュメントは次のとおりです。
私が取り組んでいるコードは、非常に洗練された (しかしまだ新しい) Objective Resource プロジェクト ( http://www.iphoneonrails.com/ ) です。
iphone - Cocoa Touch テーブルのデータソースの問題
データソースからの結果の表示に問題があります。このコードは、コンソールでは異なる (そして正しい) 結果を表示しますが、シミュレーターではあらゆる種類のランダムながらくたが発生します。
(「results」は、クラスの NSMutableArray プロパティです。)
これは、配列のメモリ保持、または配列内の文字列と関係があるのではないかと思いますか? 私はまだそのコツをつかんでいないのではないかと心配しています。
[Marc Bessey に応じて編集 -- ここにあるものはすべて基本的なデータソース メソッドだと思います]
objective-c - Objective-C のセッターに関する質問
これは、Objective-C 2.0 プログラミング言語の例です。一番下のセッターで、のvalue = [newValue retain]
代わりに使用できvalue = [newValue copy]
ますか?
objective-c - オブジェクトの保持カウントを増加させるものは何ですか?
これが私が参照しているコードです。
これで、このサンプル コードではメモリ管理が行われていないことがわかりました。何が必要ですか?
getPeople ループでは、Person (retainCount 1) を割り当て、それを配列に追加しています。リテイン回数が2回になりましたよね?2 の場合、配列に追加した後に [p release] して、retainCount を 1 に戻す必要がありますか?
メソッドによって返された配列を解放するのは呼び出し元の責任であるという点で、私は正しいですか? (カウントが 1 であると仮定すると、Person のメモリとそのインスタンス変数も解放されます)。
Apple のメモリ管理に関するドキュメントを読みましたが、最も不明な点は、オブジェクトの保持カウントが増加することでしょうか? 誰がリリースする責任があるのかという考えは理解できたと思いますが。Apple によると、これが基本的なルールです。
名前が「alloc」または「new」で始まるメソッド、または「copy」を含むメソッド (たとえば、alloc、newObject、または mutableCopy) を使用してオブジェクトを作成した場合、または保持メッセージを送信した場合、オブジェクトの所有権を取得します。release または autorelease を使用して、所有しているオブジェクトの所有権を放棄する責任があります。それ以外のオブジェクトを受け取った場合は、それを解放してはなりません。
bobDevil の文「アイテムに明示的に追加する保持カウントについてのみ心配する」という文は、私にぴったりでした。Apple の所有権ポリシーを読んだ後、基本的には、新しいオブジェクトを作成したオブジェクト/メソッドが、そのオブジェクトへの関心を解放する責任を負います。これは正しいです?
ここで、オブジェクトを受け取り、それをインスタンス変数に割り当てるメソッドがあるとします。まだ興味があるので、受け取ったオブジェクトを正しく保持する必要がありますか?
これのいずれかが正しくない場合は、お知らせください。
iphone - マルチスレッドiPhoneアプリが[NSAutoreleasePoolリリース]でクラッシュする
マルチスレッドのiPhoneアプリケーションでメモリ管理に関連する質問があります。main-UIスレッドとは別のスレッドで呼び出されるこのメソッドがあるとしましょう。
ご覧のとおりNSData
、ネットワーク運用から戻ってきたものを保持しています。問題は、メソッドの最後にリリース(または自動リリース)しないのはなぜですか?私がそれを機能させる唯一の方法はretain
、最初は使用することであり、その後は何も使用しません。他の組み合わせを使用すると(何もしない; retain
thenrelease
または)、スレッドを解放するautorelease
とプログラムがクラッシュします。私は何が欠けていますか?EXC_BAD_ACCESS
NSAutoreleasePool
参考までに、スレッドのメインコードは次のとおりです。
ご協力いただきありがとうございます!
cocoa - NSZombies が私のアプリの頭脳を食べています!
保持/解放の問題があります。私のビューはかなり複雑なので、NSZombieEnabled を YES に設定し、正確にどのオブジェクトが私に悲しみを引き起こしているかを突き止めようとしています。このプロセスをスピードアップするために、ゾンビが掘り出した墓に戻るためのヒントやトリックがあるかどうか疑問に思っています (申し訳ありませんが、そうしなければなりませんでした)、または関連するオブジェクトに戻りますか? 不可解なコンソール メッセージは、多くの洞察を提供していないようです。
「トラブルアヘッド」と呼ばれるセレクターはありません。
編集- スタック トレースを含む:
編集 2: ObjectAlloc
ObjectAlloc で問題のメモリ アドレスを調べると、次の 2 つの一致が見つかりました。
#0 GeneralBlock-48 を掘り下げる:
#1 CALayerを掘り下げる:
さて、#0 または #1 のいずれかを深く掘り下げると、まったく同じ情報が明らかになることがわかりました。これでトラブルシューティングが半分になると思いますが、まだ途方に暮れています...
objective-c - プロパティによるメモリ管理
Objective-C でのメモリ管理の理解が深まりつつありますが、理解できないことがあります。これはプロパティ宣言です:
そして、これは目に見えない合成セッターです(私は思います):
これにより、毎回保持などのすべての作業を節約できますが、初めてプロパティを設定したとします。まだ割り当てられていないため、参照カウントは 0 ですよね? 私もです
何もリリースしない場合に何が起こるかはよくわかりませんが、プロパティには既に値があり、それを設定するとします。セッターでは、まず解放されます。それで消えるんじゃないの?参照カウントが 1 で、セッターで解放された場合、保持された新しい値に設定されるためにどのように留まりますか?
ありがとう!!
objective-c - プロパティ属性「保持」が機能していないようですか?
多くの Apple コード例の 1 つからコードを少し実装しましたが、プロパティの 1 つの保持属性が機能していないように見えるため、少し問題があります。プロパティ宣言は次のとおりです。
コードは次のとおりです。
(retain) は、割り当て時に保持カウントを 1 増加させることになっていることを理解しています。ただし、[aController keep] を自分で送信するか、 [aController release] を送信しない限り、コードは失敗します。ここで何が欠けていますか?
iphone - Objective C のリリース、自動リリース、およびデータ型
私はメモリ管理されたコードは初めてですが、アイデアはかなりよくわかります。
XCode のリーク ツールを使用してアプリを実行すると、カスタム オブジェクトをクリーンアップするだけで済み、たとえば動的に作成された配列をクリーンアップする必要がないことに気付きました。そのため、これらのデータ型は自動解放されると考えました。 (保持)を持つプロパティとして使用しました。
次に、何か奇妙なことに気付きました。次のように初期化された特定の配列でリークが発生していました。
しかし似たようなものではない
さて、一方が「新規」で設定された理由は、0 ~ 99 の項目を含めることができるためです。一方、私が知っていたもう一方の項目は常に 9 であることがわかっていました。両方の配列が後でユーザーに基づいて同じメソッドに渡されるためです。メソッドの最後で解放しなかった場合はリークが発生し、解放した場合は例外が発生しました。
最初の配列を次のように変更しました
リークは発生せず、何もリリースする必要はありません。誰でも説明できますか?