【问题标题】:CoreData inserting and immediate delete: memory usage grows and growsCoreData 插入和立即删除:内存使用量越来越大
【发布时间】:2012-03-30 09:01:46
【问题描述】:

我将一个测试应用程序放在一起,从一个启用了 Core Data 的命令行工具的起点开始非常简单。 ARC 已启用。

它基本上创建一个实体,保存它,从上下文中检索所有实体并删除它们。

我不明白,为什么内存使用量越来越大? 感谢您的澄清。

这是测试程序:

main.m

#import "Message.h"

NSManagedObjectModel *managedObjectModel(void);
NSManagedObjectContext *managedObjectContext(void);

int main (int argc, const char * argv[])
{

        @autoreleasepool {
            while(true){
                // Create the managed object context
                NSManagedObjectContext *context = managedObjectContext();

                Message *message = [NSEntityDescription
                                                  insertNewObjectForEntityForName:@"Message" 
                                                  inManagedObjectContext:context];
                message.string = @"A string";

                // Save the managed object context
                NSError *error = nil;    
                if (![context save:&error]) {
                    NSLog(@"Error while saving %@", ([error localizedDescription] != nil) ? [error localizedDescription] : @"Unknown Error");
                    exit(1);
                }

                // Load and delete object from context
                NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
                NSEntityDescription *entity = [NSEntityDescription entityForName:@"Message" 
                                                          inManagedObjectContext:context];
                [fetchRequest setEntity:entity];
                NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];
                for (Message *message in fetchedObjects) {
                    NSLog(@"String is: %@", message.string);
                    [context deleteObject: message];
                    [context save: &error];
                }

                sleep(0.005);
            }
        }
    return 0;
}

NSManagedObjectModel *managedObjectModel() {

    static NSManagedObjectModel *model = nil;

    if (model != nil) {
        return model;
    }

    NSString *path = [[[NSProcessInfo processInfo] arguments] objectAtIndex:0];
    path = [path stringByDeletingPathExtension];
    NSURL *modelURL = [NSURL fileURLWithPath:[path stringByAppendingPathExtension:@"momd"]];
    model = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];

    return model;
}

NSManagedObjectContext *managedObjectContext() {

    static NSManagedObjectContext *context = nil;
    if (context != nil) {
        return context;
    }

    @autoreleasepool {
        context = [[NSManagedObjectContext alloc] init];

        NSPersistentStoreCoordinator *coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:managedObjectModel()];
        [context setPersistentStoreCoordinator:coordinator];

        NSString *STORE_TYPE = NSSQLiteStoreType;

        NSString *path = [[[NSProcessInfo processInfo] arguments] objectAtIndex:0];
        path = [path stringByDeletingPathExtension];
        NSURL *url = [NSURL fileURLWithPath:[path stringByAppendingPathExtension:@"sqlite"]];

        NSError *error;
        NSPersistentStore *newStore = [coordinator addPersistentStoreWithType:STORE_TYPE configuration:nil URL:url options:nil error:&error];

        if (newStore == nil) {
            NSLog(@"Store Configuration Failure %@", ([error localizedDescription] != nil) ? [error localizedDescription] : @"Unknown Error");
        }
    }
    return context;
}

消息.h

#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>


@interface Message : NSManagedObject

@property (nonatomic, retain) NSString * string;

@end

消息.m

#import "Message.h"


@implementation Message

@dynamic string;

@end

【问题讨论】:

  • 您不会在 while 循环中释放 fetchRequest,它每 0.005 秒创建一个实例并泄漏它。此外,运行静态分析器可能会显示一些其他内存泄漏(如果存在)。

标签: objective-c core-data memory-leaks


【解决方案1】:

你有这个

 NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];

永远不会释放的,你应该尝试将它初始化为自动释放

 NSFetchRequest *fetchRequest = [[[NSFetchRequest alloc] init] autorelease];

【讨论】:

  • 感谢您的快速回答。好的,我添加了自动释放,但这没有任何区别。我也尝试在 sleep 命令之前调用 release ,但这对内存使用也没有影响。我对ARC如何处理内存有点困惑。我在许多编程语言方面都有很多经验,但对 Objective c 还是很陌生,更令人困惑的是,您阅读的文档都是针对不同的内存处理方法编写的。但据我了解,您在使用 ARC 时不必调用任何(自动)释放语句?对吗?
  • uhm.. 奇怪,您是否尝试将您的应用程序与分析器一起运行,以查看内存分配和泄漏?
  • 我正在尝试从分析器中获取一些有用的信息,但我真的不知道我应该寻找什么。我正在查看Statistics->Object Summary 两个最消耗内存的条目是Malloc 32 Bytes 和__NSArrayM。如果我单击名称旁边的箭头,我会得到一个创建它们的列表?!到目前为止,调用者最多的是 NSManagedObjectContext。第三个条目是 NSUndoManager。屏幕截图会有帮助,还是我应该将项目存档并上传?
猜你喜欢
  • 2017-01-28
  • 1970-01-01
  • 2022-11-02
  • 1970-01-01
  • 2014-05-02
  • 2021-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多