い円形の参考にする。の作成方法を教えてください弱参照をObjective-C?
-
21-08-2019 - |
質問
い、iPhoneアプリ。私はオブジェクトのクラス Row
そのニーズをリリースに多数のオブジェクトのクラス Block
.毎 Block
の実現性を保持してインスタンス変数のクラス Row
.
@interface Block : UIImageView {
Row *yCoord;
}
@property (nonatomic,retain) Row *yCoord;
@end
毎 Row
が含まれて NSMutableArray
これらのブロックとなります。
@interface Row : NSObject {
NSMutableArray *blocks;
}
-(void)addBlock:(Block*)aBlock;
@end
@implementation Row
-(void)addBlock:(Block*)aBlock {
[blocks addObject:aBlock];
aBlock.yCoord = self;
}
@end
モバゲーさんやグリーさんとは、円形を参考にした。Appleのドキュメントの国の為を修復させようとするとエラーがオブジェクトを参照したい弱参照の代わりに強い基準(aを維持、などによって方法などの説明ができるようになったってこれを行います。Iプランをリリースdeallocすべてのブロック内の行の列そのもの。設定方法を教えてくださいまでは弱参照内のそれぞれのブロックには"親"会社である行?
解決
編集: 以降、asker明らかにしなみコレクション(iPhone、現在はサポートしていません)、または助言は避けるサイクルを一つだけのオブジェクトを保持するその他ただいに限ります。使用時の特性、使用"に割り当て"ではなく"維持"です。例えば:
@property (nonatomic,assign) Row *yCoord;
自分の回答する"弱参照"のObjective-C2.0ます。
からアップする場合、そのゴミ収集(10.5+)、弱参照を作成しよprefixing変数宣言と __weak
.ときに割り当てると変数のGC(有効になっている場合)、参考までゼロにできる場合は自動的にすべてと、強参照を参照されるオブジェクトがなくなります。(GCは有効ではありません、 __weak
属性は無視されます。)
することで、安全に変更上記の回答を再生すぐにゴミ回収(現在10.5+、かつiPhone内容を下記の通りとすることを確( 関連リンゴdocs.)
@property (nonatomic,assign) __weak Row *yCoord;
引用 クリス-ハンソン (うことができます詳細情報):
"よprefixingインスタンス変数の宣言と
__weak
, まだ、ガベージコレクタの場合はこの参照オブジェクトのオブジェクトを考えるべき収集することができた。"
いことを明らかにしよう"がない場合は非弱参照オブジェクト".どの強参照を除去し、オブジェクトで収集されたものとされる、すべての弱参照がゼロます。
注意: おにくだいすき 直接 関係を弱参照がありま __strong
属性が、Objective-Cオブジェクト変数が、強い参照で、デフォルトでは一般的にのみ使用原Cへのポインタのような構造体またはプリミティブのガベージコレクタしない扱いとして、収集したからでない場合は宣言しています。(はな __weak
き残サイクルメモリ漏れな __strong
できる結果をメモリに揃い踏みも不思議な、陰湿なバグが発生するずできることが極めて困難なトラックで安定する容量をご選定下さい。
他のヒント
ただ、割り当てる代わりに、これ以上の循環参照を保持するように変更します。
@interface Block : UIImageView {
Row *yCoord;
}
@property (nonatomic,assign) Row *yCoord;
@end
弱参照は(あなたがワームの全体分離することができますがガベージコレクションの話をしている場合を除き、しかしサイクルを維持するに罹患していない)単純に代入されます。
通常は、ココアに、Row
は(NSMutableArrayのに含めることによって)Block
オブジェクトを保持するだろうが、それぞれが単に(「割り当て」プロパティで)IVARに格納なる、Block
をRow
保持しないであろう。
限り、それは割り当てを解除される前に、Row
は各Block
を解放するように注意されるよう(すなわち、そのdealloc
は限り誰もが彼らへのポインタを持っていないようブロックを解放しますどのNSMutableArrayのを解放する必要があります)、その後、すべてが適切に割り当て解除されますます。
また、のようなものを配列からentiriesを削除する前に、ブロックからの行の参照をゼロの予防策を取ることができます
- (void) dealloc {
for (Block* b in _blocks) {
b.row = nil;
}
[_blocks release];
[super dealloc];
}
ここで_blocks、ブロックプロパティによって参照IVARである。
を割り当てを弱参照可能で安全に下記からダウンロードでき、特にかかる料金等についてオブジェクト保持することができるオブジェクトは、その逆参照のその他のオブジェクトです。
幸いなことに、この問題の階層のオブジェクトを含む弱参照の利益ばかり考えて行動しているオブジェクトでは、以るオブジェクトです。これは、通常の優れた<->配下の関係です。
この場合のOPのコメントを図ることで、列=スーペリアブロック=下位.
この場合には、利用ハンドルをご覧に優れらの下位:
// Superior.h
@class Superior;
@interface SuperiorHandle : NSObject {
@private
Superior* superior_;
}
// note the deliberate avoidance of "nonatomic"
@property (readonly) Superior *superior;
@end
@interface Superior : NSObject {
@private
SuperiorHandle *handle_;
// add one or more references to Subordinate instances
}
// note the deliberate avoidance of "nonatomic"
@property (readonly) SuperiorHandle *handle;
@end
// Superior.m
#import "Superior.h"
@implementation SuperiorHandle
@synthesize
superior = superior_;
- (id)initWithSuperior:(Superior *)superior {
if ((self = [super init])) {
superior_ = superior; // weak reference
}
}
- (void)invalidate {
@synchronized (self) {
superior_ = nil;
}
}
- (Superior *)superior {
@synchronized (self) {
// retain and autorelease is required to prevent dealloc before we're ready, thanks to AndroidDev for pointing out this mistake
return [[superior_ retain] autorelease];
}
}
@end
@implementation Superior
@synthesize
handle = handle_;
- (id)init {
if ((self = [super init])) {
handle_ = [[SuperiorHandle alloc] initWithSuperior:self];
}
return self;
}
- (void)dealloc {
[handle_ invalidate];
[handle_ release];
[super dealloc];
}
@end
// Subordinate.h
@class Superior;
@class SuperiorHandle;
@interface Subordinate : NSObject {
@private
SuperiorHandle *superior_handle_;
}
@property (readonly) Superior *superior;
@end
// Subordinate.m
#import "Subordinate.h"
#import "Superior.h"
@implementation Subordinate
// no synthesize this time, superior's implementation is special
- (id)initWithSuperior:(Superior *)superior {
if ((self = [super init])) {
superior_handle_ = [superior.handle retain];
}
return self;
}
- (void)dealloc {
[superior_handle_ release];
[super dealloc];
}
- (Superior *)superior {
@synchronized (superior_handle_) {
return superior_handle_.superior;
}
}
@end
メリット:
- このスレッドで安全です。ができるのは弱参照に含まれる下位となり、無効なポインタです。となるnilがあります。
- だけのオブジェクト自体を知る必要があり、組み込みに弱い。他のすべてのオブジェクト処理に劣後している場合は、通常の参照に優れている。