我有一个由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
这将帮助您找到对象的僵尸对象,如果有任何对象您要释放多次访问该值。
祝你好运!