Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 内存泄漏,重新分配NSArray属性_Iphone_Objective C_Memory Management_Memory Leaks - Fatal编程技术网

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;