内存泄漏,重新分配NSArray属性



我有一个由NSArray属性支持的UITableView。数组被声明为属性:

@property (nonatomic, retain) NSArray *events;
@synthesize events;

并用于以下方法。仪器一直告诉我populateEvents导致了泄漏。我已经尝试了该代码的许多变体,但最终还是出现了更多的泄漏或EXC_BAD_ACCESS

- (void)viewDidLoad
    {
        self.events = [self populateEvents];
    }
    - (void)updateData
    {   
        events = nil;
        self.events = [self populateEvents];
        [self.tableView reloadData];
    }
    - (NSArray*)populateEvents
    {
        NSMutableArray *response = [[NSMutableArray alloc] init];
        NSString *sql = [NSString stringWithFormat:@"SELECT * FROM Event"];
        sqlite3_stmt *statement = [database prepare:sql];
        if(statement != nil)
        {
            // Loop through the results and add them to the response
            while(sqlite3_step(statement) == SQLITE_ROW)
            {
                Event *event = [[Event alloc] init];
                event.subject = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 0)];
                e
                [response addObject:event];
                [event release];
            }
            sqlite3_finalize(statement);
        }
        return [response autorelease];
    }

更新你们中的很多人都在问关于活动类别的问题:

@interface Event : NSObject
@property (nonatomic) NSInteger Id;
@property (nonatomic, retain) NSString *subject;
@property (nonatomic, retain) NSString *details;
@property (nonatomic, retain) NSString *startTime;
@property (nonatomic, retain) NSString *endTime;
@property (nonatomic, retain) NSString *eventType;
@property (nonatomic, retain) NSString *employee;
@end
- (void)dealloc
{
    [super dealloc];
    [subject release];
    [details release];
    [startTime release];
    [endTime release];
    [eventType release];
    [employee release];
}

- (NSString*)startTime
{
    return [self humanReadableDate:startTime];
}

- (NSString*)endTime
{
    return [self humanReadableDate:endTime];
}

- (NSString*)humanReadableDate:(NSString*)isoDate
{
    NSDateFormatter* formatter = [[[NSDateFormatter alloc]init]autorelease];
    [formatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss"];
    NSDate* date = [formatter dateFromString:isoDate];
    [formatter setDateFormat:@"MMM dd yyyy HH:mm"];
    NSString* humanrReadable = [formatter stringFromDate:date];
    return humanrReadable;
}
@end

这是一个泄漏,因为您在不释放前一个对象的情况下将NSArray(事件)的指针更改为nil。您丢失了指向上一个数组的指针,因此发生了泄漏。

更改

events = nil;

self.events = nil;

您应该在调用[super dealloc]之前释放Events类中的内部对象

并删除updateData方法中的events = nil;。这是不必要的,即使在修复了Events类之后也会导致问题。

问题出在线上

event = nil;

由于您的属性设置为retain,所以事件指向nil而不释放以前的内存。

您可以直接拨打self.events = [self populateEvents];它将在分配之前先释放上一个obj,并保留obj。

只需在XCode项目的"组和文件"窗格中设置此环境变量,您将找到可执行文件->您的应用程序->右键单击->获取信息->参数选项卡->环境变量

名称:NSZombieEnabled
值:YES

这将帮助您找到对象的僵尸对象,如果有任何对象您要释放多次访问该值。

祝你好运!

最新更新