0

プロジェクトにこのクラスのヘッダーがあります。

    @interface VideoItem : NSObject <NSCoding> {
        NSString *idStr;
        NSString *name;
        NSString *link;
    }

    -(id)initWithVideoItem:(VideoItem*)video;

    @property (nonatomic, retain) NSString *name;
    @property (nonatomic, retain) NSString *link;
    @property (nonatomic, retain) NSString *idStr;

    @end

これは実装です:

@implementation VideoItem
@synthesize name,link,idStr;

-(id)initWithVideoItem:(VideoItem*)video{
    if (self = [super init]) {
        self.name = video.name;
        self.link = video.link;
        self.idStr = video.idStr;
    }
    return self;
}

#pragma mark 
#pragma mark NSCoder

- (void)encodeWithCoder:(NSCoder *)encoder{
    [encoder encodeObject:self.name forKey:@"video_name"];
    [encoder encodeObject:self.link forKey:@"video_link"];  
    [encoder encodeObject:self.idStr forKey:@"video_id"];   
    [encoder encodeObject:self.imgUrl forKey:@"video_img"];
    [encoder encodeObject:self.viewCount forKey:@"video_views"];
    [encoder encodeObject:self.artist forKey:@"video_artist"];
    [encoder encodeObject:self.timeStr forKey:@"video_timestr"];    
    [encoder encodeInt:self.seconds forKey:@"video_secondes"];
    [encoder encodeInt:self.rating forKey:@"video_rating"];
    [encoder encodeObject:self.pubDate forKey:@"pubDate"];

}

- (id)initWithCoder:(NSCoder *)decoder {
    if(self = [super init]){
        self.name = [decoder decodeObjectForKey:@"video_name"];
        self.link = [decoder decodeObjectForKey:@"video_link"]; 
        self.idStr = [decoder decodeObjectForKey:@"video_id"];
    }
    return self;
}

@end

deallocそして、このような場合にメソッドを追加して文字列を解放する必要があるかどうかを知りたいですか?

4

6 に答える 6

1

ARCを使用して、メモリ管理に関連する問題を忘れてください。アップルでさえ、可能な限りARCの使用を推奨しています。これを新しい開発として行う場合は、ARCを使用することをお勧めします。

ARCを使用したくない場合は、deallocを実装し、メンバー変数を解放する必要があります。

于 2013-01-17T08:53:39.203 に答える
1

はい、オブジェクトを保持するプロパティを使用する場合は、文字列を解放する必要があります。

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

通常、初期化でオブジェクトをコピーします。これは、元のオブジェクトを保存して編集または解放できるため、より良い方法です。

-(id)initWithVideoItem:(VideoItem*)video{
    if ((self = [super init])) {
        name = [video.name copy];
        link = [video.link copy];
        idStr = [video.idStr copy];
    }
    return self;
}

copyメソッドは保持されたオブジェクトを返すため、プロパティをスキップする必要があります。これにより、保持カウントが増加します。

もう1つの注意点:objective-cの規則では、プライベートivarは、_プロパティではないことをより明確にするために、で始める必要があります。

于 2013-01-17T08:54:12.370 に答える
0

文字列のプロパティを保持しています。それで、それを解放するのはあなたの仕事です。

したがって、deallocメソッドを追加して解放します。

- (void)dealloc
{
   [idStr release];
   [name release];
   [link release];
   [super dealloc];
}
于 2013-01-17T08:53:46.417 に答える
0

これを使用して、割り当てられたすべての変数を解放し、最後にsuperdeallocを呼び出します。

- (void)dealloc{
   [idStr release];
   [name release];
   [link release];
   [super dealloc];
}
于 2013-01-17T08:55:26.557 に答える
0

変数を保持しているので、-(void)deallocメソッドを記述する必要があります。このメソッドでこれらの変数を解放します。

于 2013-01-17T09:02:48.107 に答える
-1

実際、ivarでリリースを呼び出す必要はありません。代わりに、プロパティself.ivar=nilを使用してください。これにより、メモリが解放され、ダングリングポインタがないため、ポイントがnilに設定されます。

[ivar release]を使用すると、ivarは解放されますが、ダングリングポインターであるため、ほとんどの場合ivar = nil; ivarをリリースした後に行われます。

- (void)dealloc
{
   self.idStr = nil;
   self.name = nil;
   self.link = nil;

   [super dealloc];
}    
于 2013-01-17T10:31:49.500 に答える