【发布时间】:2012-03-07 10:53:03
【问题描述】:
我有一个由NSArray 属性支持的UITableView。数组被声明为属性:
@property (nonatomic, retain) NSArray *events;
@synthesize events;
并用于以下方法。 Instruments 不断告诉我 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
【问题讨论】:
-
你的代码中有什么需要
events = nil? -
如果我不在 populateEvents 中自动释放响应,则没有 exc_bad_access 但仍然存在泄漏
标签: iphone objective-c memory-management memory-leaks