私はロードが人物オブジェクトの私のUITableView法cellAtRowForIndexPathインサイドどのようにしてメモリが漏れていますか?
Person.h
#import <UIKit/UIKit.h>
#import "TwitterHelper.h"
@interface Person : NSObject {
NSDictionary *userInfo;
NSURL *image;
NSString *userName;
NSString *displayName;
NSArray *updates;
}
/*
@property (retain) NSString *userName;
@property (retain) NSString *displayName;
@property (retain) NSDictionary *userInfo;
*/
@property (nonatomic, copy) NSURL *image;
@property (retain) NSArray *updates;
- (id)initWithUserName:userName;
@end
Person.m
#import "Person.h"
@implementation Person
/*
@synthesize userName;
@synthesize displayName;
@synthesize userInfo;
*/
@synthesize image;
@synthesize updates;
- (id)initWithUserName:(NSString *)user{
userName = user;
userInfo = [TwitterHelper fetchInfoForUsername:user];
displayName = [userInfo valueForKey:@"name"];
image = [NSURL URLWithString:[userInfo valueForKey:@"profile_image_url"]];
updates = [TwitterHelper fetchTimelineForUsername:userName];
return self;
}
- (void)dealloc
{
/*
[userName release];
[displayName release];
[updates release];
[userInfo release];
[image release];
*/
[super dealloc];
}
@end
を作成するときに、私は一人一人のオブジェクトを作成していますことをテーブルビューを持っているし、イメージプロパティを割り当てます。
Person *person = [[Person alloc] initWithUserName:userName];
NSData *data = [[NSData alloc] initWithContentsOfURL:person.image];
[data release];
これをインストゥルメントで実行すると、NSData *データ行がハイライト表示され、そこにリークが表示されます。
なぜそこに漏れていますか?
プロパティを宣言する方法(アトミック、保持、コピーなど)で違いがありますか? – Jason
私はそれが違いを生むと知っているはずですが、私の上記の例では、何をすべきでしょうか? – Jason
いいえ!イニシャライザやdeallocメソッドでは、アクセサー(明示的にまたはドット表記法)を使用しないでください。これらのメソッドでは、直接プロパティアクセス*を使用します。getter/setterを呼び出すと、これらの2つの状況で意図しない(そして不適切な)対処が行われる可能性があります。 ただし、NSURLをコピーする必要があります。 Cocoaのメモリ管理ガイドを再度読んでください。 –