繁体   English   中英

为什么此代码在仪器上泄漏?

[英]Why is this code leaking on instruments?

我正在对仪器进行一些内存分析,感觉好像我的代码似乎在进行适当的内存管理。 但是,仪器确信我正在泄漏,因此我不知道如何消除泄漏。

在我的Event.h中。


@property (nonatomic, copy) NSString *organizer;
@property (nonatomic, copy) NSString *type;
@property (nonatomic, retain) NSDate *startTime;
@property (nonatomic, retain) NSDate *endTime;
@property (nonatomic, copy) NSString *coverCharge;
@property (nonatomic, copy) NSString *ageLimit;
@property (nonatomic, copy) NSString *dressCode;
@property (nonatomic, copy) NSString *venueName;
@property BOOL attendingFlag;

它们都在dealloc中释放


- (void) dealloc {
    [type release];
    [organizer release];
    [startTime release];
    [endTime release];
    [coverCharge release];
    [ageLimit release];
    [dressCode release];
    [venueName release];
    [super dealloc];
}   

在我的工厂班上,我有


-(Event*) getEvent:rs {
    Event *event = [[Event alloc] init];
    event.objId = [NSNumber numberWithInt:[rs intForColumn:DATABASE_EVENT_ID_FIELD]];
    event.name= [rs stringForColumn:DATABASE_EVENT_NAME_FIELD];
    event.organizer = [rs stringForColumn:DATABASE_EVENT_ORGANIZER_FIELD];
    event.type = [rs stringForColumn:DATABASE_EVENT_TYPE_FIELD];
    event.desc= [rs stringForColumn:DATABASE_EVENT_DESCRIPTION_FIELD];
    event.venueName = [rs stringForColumn:DATABASE_EVENT_VENUE_NAME_FIELD];
    event.coverCharge= [rs stringForColumn:DATABASE_EVENT_COVER_CHARGE_FIELD];
    event.dressCode = [rs stringForColumn:DATABASE_EVENT_DRESS_CODE_FIELD];
    event.ageLimit = [rs stringForColumn:DATABASE_EVENT_AGE_LIMIT_FIELD];
    event.region = [[[Region alloc] initWithIdAndName:[NSNumber numberWithInt:[rs intForColumn:DATABASE_EVENT_REGION_ID_FIELD]] name:[rs stringForColumn:DATABASE_EVENT_REGION_NAME_FIELD]] autorelease];
    event.community = [[[Community alloc] initWithIdAndName:[NSNumber numberWithInt:[rs intForColumn:DATABASE_EVENT_COMMUNITY_ID_FIELD]] name:[rs stringForColumn:DATABASE_EVENT_COMMUNITY_NAME_FIELD]] autorelease];
    event.address = [rs stringForColumn:DATABASE_EVENT_ADDRESS_FIELD];
    event.address2 = [rs stringForColumn:DATABASE_EVENT_ADDRESS2_FIELD];
    event.city = [rs stringForColumn:DATABASE_EVENT_CITY_FIELD];
    event.state = [rs stringForColumn:DATABASE_EVENT_STATE_FIELD];
    event.zip = [rs stringForColumn:DATABASE_EVENT_ZIP_FIELD];
    event.country = [rs stringForColumn:DATABASE_EVENT_COUNTRY_FIELD];
    event.phone = [rs stringForColumn:DATABASE_EVENT_PHONE_FIELD];
    event.webpage = [rs stringForColumn:DATABASE_EVENT_WEBPAGE_FIELD];

    return [event autorelease];
}

您可能会注意到,我在事件上设置的属性比上面提到的要多,这是因为我让Event扩展了另一个更通用的Entity。 我什至没有发布该代码的原因是因为根据工具,我什至泄漏Event类本身的设置器。

Instruments抱怨说,事件分配上有泄漏,而getEvent选择器的每一行上都有一个泄漏。 rs是我正在整个应用程序中使用的库(FMDB)的结果集对象,这似乎是检测到这些泄漏的唯一实体,因此,我敢肯定这不是问题。 实际上,最近我实际上已将该相同的库用于另一个项目,并且没有由它引起的泄漏,因此我已将其消除为泄漏源。

(a)当我返回事件对象时,我显然会自动释放它。

(b)我所有的二传手都在获取自动释放的对象,因此我只是按照内存管理文档对目标c的建议增加保留数。

知道为什么分配行及其后的几乎每一行都可能泄漏吗?

答案是其他地方的代码保留了您的Event对象。 泄漏只能显示创建泄漏的内存的位置,泄漏不能显示创建后正确释放对象的代码!

其他行均被标记为泄漏,因为Event对象正在泄漏。

要做的是除了“泄漏”外添加“分配”工具,并确保将其设置为“记录参考计数”(时间图上“分配”栏中的小(i))。 然后启动您的应用程序,观察泄漏。 然后选择分配工具,选择“创建并仍然存在”,并查找仍然存在的事件对象。

然后单击地址旁边的箭头,您将获得该对象的每个保留和释放的列表。 通常,您可以从中找出保留了该对象的对象,该对象也应在以后释放它,但没有释放它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM