簡體   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