【发布时间】: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