Iphone 内存泄漏,重新分配NSArray属性
我有一个由Iphone 内存泄漏,重新分配NSArray属性,iphone,objective-c,memory-management,memory-leaks,Iphone,Objective C,Memory Management,Memory Leaks,我有一个由NSArray属性支持的UITableView。数组被声明为属性: @property (nonatomic, retain) NSArray *events; @synthesize events; 并在以下方法中使用。仪器一直告诉我,人口事件导致了泄漏。我已经尝试了很多版本的代码,但最终还是出现了更多的漏洞或EXC\u BAD\u ACCESS - (void)viewDidLoad { self.events = [self populateEvent
NSArray
属性支持的UITableView
。数组被声明为属性:
@property (nonatomic, retain) NSArray *events;
@synthesize events;
并在以下方法中使用。仪器一直告诉我,人口事件导致了泄漏。我已经尝试了很多版本的代码,但最终还是出现了更多的漏洞或EXC\u BAD\u 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;
到
问题就在眼前
event = nil;
由于您的属性设置为retain,事件将指向nil,而不释放以前的内存
您只需调用self.events=[self populateEvents]代码>
在分配和保留obj之前,它将首先释放上一个obj 在调用[super dealloc]
之前,您应该在事件类中释放内部对象
并删除events=nil。这是不必要的,即使在您修复事件类之后也会导致问题。只需在XCode项目组和文件窗格中设置此环境变量,
您将找到可执行文件->应用程序->右键单击->获取信息->参数选项卡->环境变量
名称:NSZombieEnabled
价值观:是的
这将帮助您找到对象的僵尸对象,如果有任何对象在访问该值的过程中多次释放
祝你好运 你的代码中有什么必要使用events=nil
?如果我不在populateEvents中自动释放响应,那么就没有exc\u bad\u访问,但仍然存在泄漏。如果使用self.events=nil,我获取exc\u bad\u访问。事实上,它不应该是其他原因造成的。另外,您可以一起删除这一行,不需要这一行代码。X斜杠是正确的。如果您仍然遇到问题,那么代码中可能还有更多的bug。我猜事件
类上的subject
属性没有声明为retain
或copy
。Hi-Hanon removing events=nil给我EXC\u BAD\u access事件中的结构是什么?
event = nil;