为什么执行executeFetchRequest:fetchRequest会导致内存泄漏?

3
仪器显示以下代码泄漏,如果我注释掉这段代码,就不会有泄漏。
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];

    // Edit the entity name as appropriate.

    NSEntityDescription *entity = [NSEntityDescription entityForName:USER_CORE_DATA inManagedObjectContext:self.managedObjectContext];

    [fetchRequest setEntity:entity];

    NSPredicate *predicte = [NSPredicate predicateWithFormat:@"username == %@", [[User defaultManager] savedUsername]];
    [fetchRequest setPredicate:predicte];

    // set any predicates or sort descriptors, etc.

    // execute the request
    [self.managedObjectContext executeFetchRequest:fetchRequest onSuccess:^(NSArray *results) {

    } onFailure:^(NSError *error) {

        NSLog(@"Error fetching: %@", error);

    }];
    [fetchRequest release];

具体来说,上面的代码中这行指令的含义是:

[self.managedObjectContext executeFetchRequest:fetchRequest onSuccess:^(NSArray *results)

看起来是 fetchRequest 和/或块存在泄漏。 感谢您提前的任何帮助。


对于这些复杂性...我将它们转换为ARC。 - Anoop Vaidya
2个回答

0
实际上,事实证明StackMob的代码存在漏洞,我下载了他们的源代码并进行了修复。
- (NSString *)primaryKeyField
{
    NSString *objectIdField = nil;

    // Search for schemanameId
    objectIdField = [[self SMSchema] stringByAppendingFormat:@"Id"];
    if ([[[self entity] propertiesByName] objectForKey:objectIdField] != nil) {
        return objectIdField;
    }

    objectIdField = nil;  // This line was missing and causing a leak

    // Search for schemaname_id
    objectIdField = [[self SMSchema] stringByAppendingFormat:@"_id"];
    if ([[[self entity] propertiesByName] objectForKey:objectIdField] != nil) {
        return objectIdField;
    }

    objectIdField = nil;  // This line was missing and causing a leak

    // Raise an exception and return nil
    [NSException raise:SMExceptionIncompatibleObject format:@"No Attribute found for `entity %@ which maps to the primary key on StackMob. The Attribute name should match one of the following formats: lowercasedEntityNameId or lowercasedEntityName_id.  If the managed object subclass for %@ inherits from SMUserManagedObject, meaning it is intended to define user objects, you may return either of the above formats or whatever lowercase string with optional underscores matches the primary key field on StackMob.", [[self entity] name], [[self entity] name]];`

0

看起来executeFetchRequest:onSuccess:onFailure:是你在NSManagedObjectContext类别中定义的函数。确保你传递给onSuccess块的NSArray对象实例已被自动释放。


这不是函数,而是一个区块。 - Anoop Vaidya
@AnoopVaidya 来吧,executeFetchRequest:onSuccess:onFailure:是一个函数,传递给onSuccess和onFailure的参数是块! - Adithya
“executeFetchRequest:onSuccess:onFailure:”是StackMob库中定义的一个函数,我无法查看它。我可以尝试自己释放NSArray来查看是否会有任何变化。 - Michael Wildermuth
好的。然后数组被自动释放,这很好。 - Adithya
@MichaelWildermuth 选择使用 ARC。 - Adithya
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接