Iphone 为什么这个代码在仪器上泄漏?

Iphone 为什么这个代码在仪器上泄漏?,iphone,objective-c,memory-management,memory-leaks,retaincount,Iphone,Objective C,Memory Management,Memory Leaks,Retaincount,我在仪器上做一些内存分析,我觉得我的代码似乎在做正确的内存管理。然而,仪器公司确信我在泄漏,我不知道如何消除泄漏 就我而言,我有 @property (nonatomic, copy) NSString *organizer; @property (nonatomic, copy) NSString *type; @property (nonatomic, retain) NSDate *startTime; @property (nonatomic, retain) NSDate *endT

我在仪器上做一些内存分析,我觉得我的代码似乎在做正确的内存管理。然而,仪器公司确信我在泄漏,我不知道如何消除泄漏

就我而言,我有


@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;
他们都被释放了


- (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];
}
您可能会注意到,我在事件上设置的属性比我上面提到的要多,这是因为我有一个事件扩展了另一个更通用的实体。我甚至没有发布该代码的原因是,根据工具,我甚至泄漏了事件类本身的setter

Instruments抱怨事件alloc上存在泄漏,getEvent选择器中的每一行上都存在泄漏。rs是一个库(FMDB)中的resultset对象,我在整个应用程序中都在使用它,它似乎是唯一检测到这些泄漏的实体,所以我很确定这不是问题所在。事实上,我最近在另一个项目中使用了同一个库,并且没有因为它而导致泄漏,所以我将它作为泄漏源排除

(a) 当我返回事件对象时,我显然是在自动返回它

(b) 我所有的setter都得到了自动释放的对象,所以我只增加了目标c的内存管理文档所建议的保留计数


你知道为什么alloc行和它后面的几乎每一行都可能泄漏吗?

答案是其他地方的代码保留了你的事件对象。“泄漏”只能向您显示已泄漏的内存是在何处创建的,而“泄漏”无法向您显示应编写的代码,以便在创建后正确释放对象

其他行都标记为泄漏,因为事件对象正在泄漏

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


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

谢谢Kendall。这是有道理的。事实上,我已经在使用事件的客户端代码中发现了另一个漏洞,所以我怀疑这是否是罪魁祸首。此后我再也没有运行过它,因为我认为我需要修复我发布的代码中的某些内容。我将再次运行仪器,如果事件仍在泄漏,我将遵循您的建议并返回结果。谢谢你的推荐。你好,肯德尔。看来我对客户端代码的修复已经解决了这个问题。然而,你给了我一些非常有用的建议,我将使用这些建议来处理我遇到的其他几个漏洞。我将为您的回答授予荣誉,因为您关于这是一个事件的客户代码问题的评论非常具有启发性和帮助性。;)