内存泄漏问题,我需要帮助#1

| 我对此非常陌生,似乎在这段我无法修复的代码中存在漏洞: 仪器在此行显示100%:   NSMutableArray * read_Question = [[[NSMutableArray alloc] initWithCapacity:0]; 我已经尝试过各种方法,但无法修复。 有人可以建议我如何进行吗?
- (NSMutableArray *)readQuestion: (int)questionNr {

NSMutableArray *read_Question = [[NSMutableArray alloc] initWithCapacity: 0];

NSError *error;
//=========PREPARE CORE DATA DB===========//
if (managedObjectContext == nil) {
    managedObjectContext = [(FamQuiz_R0_1AppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; }
    // Define qContext
    NSManagedObjectContext *qContext = [self managedObjectContext];
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@\"questions\" inManagedObjectContext:qContext];
    [fetchRequest setEntity:entity];

    NSArray *fetchedObjects = [qContext executeFetchRequest:fetchRequest error:&error];
    for (NSManagedObject *info in fetchedObjects) {
        if ([[info valueForKey:@\"idQ\"] intValue] == questionNr) { 
            [read_Question addObject:[info valueForKey:@\"question\"]];
            [read_Question addObject:[info valueForKey:@\"qRightAnswer\"]];
            [read_Question addObject:[info valueForKey:@\"qWrongAnswer1\"]];
            [read_Question addObject:[info valueForKey:@\"qWrongAnswer2\"]];
        }
    }   
    [fetchRequest release];
    return [read_Question autorelease];
}
    
已邀请:
它表明您仅在if语句内返回对象。这意味着,如果if语句为false,则不会自动释放该数组。也许您没有粘贴整个方法。让我知道。仪器有时很棘手。     
这是您的其他问题的虚假信息内存泄漏问题,我需要帮助#1   当我释放时,我陷入了麻烦,   当然。我确实试图改变   在三个名称上,然后发布   有唯一的名字,但是   不行。 在三个不同的文件中更改名称?那不会做任何事情,它表明您还没有完全将头放在对象,指针和内存管理上。 《 Objective-C和内存管理》指南将有所帮助。   这可能是泄漏的原因   我在这个.m文件中? 不,正如我在另一个问题中回答的那样,最有可能发生泄漏,因为您保留了该方法返回的对象,然后不在任何地方释放它。     
仪器告诉您泄漏对象是分配的,而不是泄漏对象所在的位置。 尽管在从该方法返回时并不能在所有情况下都自动释放数组,但您也可能会将其保留在其他位置,并且无法通过发布来平衡保留。     
我假设您将属性ManagedObjectContext设置为\“ retain \”。将行更改为此(包括\“ self \”,以便保留它):
if (self.managedObjectContext == nil) { self.managedObjectContext = [(FamQuiz_R0_1AppDelegate *)
                                                       [[UIApplication sharedApplication] delegate] managedObjectContext]; }
然后重新添加您的发行版。     
由于我相信picciano的代码将解决opensposter的问题,因此在这里简单解释一下为什么应该解决该问题。 如果为属性提供一个keep属性,它将创建一个访问器方法,看起来像这样(简化):
@property (nonatomic, retain) NSValue *value;

- (void)setValue:(NSValue *)aValue {
    value = [aValue retain];
}
仅当retainCount达到0时,才使用retain,alloc和copy释放对象,从而增加retainCount。请记住:仅当使用访问器方法时,保留才真正发生(除了使用alloc,保留和直接复制外)。使用以下方法之一时,通常会调用accessor方法:
// the 2 most obvious ways to call the accessor methods ...
object.value = someValue;
[object setValue:someValue];
您已经在代码中创建了一个keep属性,但是您并未使用accessor方法,因此该对象从未被保留。
// no accessor used here ...
managedObjectContext = [(FamQuiz_R0_1AppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
如果您从这一点开始释放它,将导致崩溃,因为retainCount实际上在某个时刻变为-1(因为它从一开始就从未达到1)。因此,您应该这样设置属性:
// the dot-notation syntax to make use of the accessor method ...
self.managedObjectContext = [(FamQuiz_R0_1AppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
或者(我认为最好):
// making use of the accessor method directly, which is very unambiguous ...
NSManagedObjectContext *context = [(FamQuiz_R0_1AppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
[self setManagedObjectContext:context];
这样,您可以确定保留确实发生了。 在我看来,访问器设置程序的第二种表示法是高级的,我认为在可能的情况下使用它来设置属性是个好习惯。在以下站点上了解有关分享此观点及其推理的人们的更多信息: 可可是我的女朋友 大书呆子牧场     

要回复问题请先登录注册