Objective-C 2.0以降で正しい読み取り専用プロパティを作成する方法に関する2つの質問があります。 「『リターンA_』での潜在的な漏れ」:このような警告システムレポート、私はそれをコンパイルし、分析すると正しいreadonlyプロパティを書き込む方法は?
@interface ClassA{
@private
NSMutableArray *a_;
}
// NOTE: no retain
@property (nonatomic, readonly) NSMutableArray *a;
@end
///////////////////////////////////////
@implementation ClassA
@synthesize a = a_;
- (NSMutableArray *)a{
if(nil == a_){
a_ = [[NSMutableArray alloc] array];
}
// Potential leak warning on the following line.
return a_;
}
- (void)dealloc{
// I released the object here, I think this should be safe.
[a_ release];
[super dealloc];
@end
:ここ
はのは、ソリューション1それを呼ぶことにしましょう、私の独創的なアプローチであります。
次にObjective-Cのドキュメントをもう一度読んで、次のような別のアプローチを見つけます。 ソリューション2としましょう。
@interface ClassB{
@private
NSMutableArray *a_;
}
// NOTE: make it retain+readonly
@property (nonatomic, readonly, retain) NSMutableArray *a;
@end
///////////////////////////////////////
// Add a private category
@interface ClassB()
// reset the property to readwrite
@property (nonatomic, readwrite, retain) NSMutableArray *a;
@end
//////
@implementation ClassB
@synthesize a = a_;
- (id)init{
if(self = [super init]){
// NOTE: set the value as we use property normally.
self.a = [NSMutableArray array];
}
return self;
}
- (void)dealloc{
self.a = nil;
[super dealloc];
@end
今、ここに私の質問は以下のとおりです。
- それは解決策1を使用すると「潜在的な漏れ」を取り除くことは可能ですか?
- ソリューション2は一般的なソリューションですか?
君たちをありがとう!
- あなたが今、読み取り専用プロパティの値は、前もってなる場合Tonny
'[[NSMutableArrayの -
(
-dealloc
で使用するための-dealloc
およびおそらくは-init
のプロパティを使用しない理由が存在するようにもちろん、私はまだ合成 - この例では、someArray_
明示IVARを宣言する。) alloc] array] 'はコンパイラの警告を出さなければなりません。それは間違いなくクラッシュします。 '[[NSMutableArray alloc] init]'が必要です。 –@ NSMutableArray a_;で '*'を見逃しました – EmptyStack
@Simon、ありがとう、私は手作業でタイプし、コンパイラでコンパイルしませんでした。私はそれを修正しました。 –