2011-09-12 12 views
1

私はこの単純なクラスは、メモリリークの点で大丈夫です知っている。objective-cオブジェクトのメモリ管理

@interface location : NSObject { 
     NSString *name; 
     float lat; 
     float lon; 
     NSString *subtitle; 
    } 

    @property (nonatomic, retain) NSString *name; 
    @property (nonatomic, retain) NSString *subtitle; 
    @property (nonatomic, assign) float lat; 
    @property (nonatomic, assign) float lon; 


    @end 

    @implementation location 

    @synthesize name; 
    @synthesize lon; 
    @synthesize lat; 
    @synthesize subtitle; 

    -(void)dealloc{ 
     [name release]; 
     [subtitle release]; 
     [super dealloc]; 
    } 

    @end 

@propertyにはretainがありますので、私はdeallocメソッドでリリースしました。今、私の質問は:initメソッドまたは私が作成する他のメソッドの文字列のいずれかを割り当てる場合、私は別のリリースを行う必要がありますか?もしそうなら、いつ?

@implementation location 

@synthesize name; 
@synthesize lon; 
@synthesize lat; 
@synthesize subtitle; 

-(void) init{ 
     name = [[NSString alloc] init]; 
} 

-(void)dealloc{ 
    [name release]; // IS THIS CORRECT?! 
    [subtitle release]; 
    [super dealloc]; 
} 

@end 

答えて

2

あなたは、新しいオブジェクトを作成するためのalloc + initアプローチを使用していたならば、あなたはrelease(あなたがsynthesizeを使用している場合retainとして、自動的に呼び出されました)はずですself.表記を使用して値を代入している場合。例:

NSString *str = [[NSString alloc] init]; 
self.name = str; 
[str release]; 

あなたがself.表記を使用して値を代入し、自動解放オブジェクトを割り当てている場合、あなたはいけないretainrelease。例:あなたはself.接頭辞なしで値を割り当てる場合

NSString *str = [NSString string]; 
self.name = str; 

、あなたはautoreleaseオブジェクトを割り当てるべきではないとreleaseいけない、あなただけのalloc + initオブジェクトをする必要があります。例:

NSString *str = [[NSString alloc] init]; 
name = str; 

それとも、self.接頭辞なしassign自動解放オブジェクトにしたいならば、あなたはそれを維持する必要があります。例:あなたは以前のことをしなかった場合は、release objectsべきdealloc方法で

NSString *str = [NSString string]; 
name = [str retain]; 

+0

おかげで、最初の例では、私の質問を解決しました。 –

0

基本的には、何も提出していないので、ここに保持する必要はありません。コードは、すべてのプロパティが割り当てられている場合と同じです。

self.nameを呼び出さないうちは、保持のセマンティクスは適用されません。

この混乱を排除するコードスタイルがあります。プロパティ名とインスタンス名を別のままにして、インスタンス名を@synthesizeのプロパティ名に割り当てます。このよう

@interface location : NSObject { 
    NSString *name; 
} 

@property (nonatomic, retain) NSString *nameProp; 


@end 

@implementation location 

@synthesize nameProp = name; 
+0

これを行うことで、どこから解放する必要がありますか?そして、通話によって文字列をどのように設定できますか? –

+0

あなたが場所クラスの中にいるなら、単にself.nameProp = nil;を実行してください。これを解放するには、self.nameProp = newObjet;これをnewObjectに置き換えると、self.namePropに割り当てられている以前のオブジェクトが自動的に解放されます。 locationObjectという名前のロケーションオブジェクトがある場合、ちょうどlocationObjectに自分自身をchnageします。 –