Ios self.fetchedResultsController正在抛出EXC\u BAD\u访问权限,而fetchedResultsController工作正常

Ios self.fetchedResultsController正在抛出EXC\u BAD\u访问权限,而fetchedResultsController工作正常,ios,objective-c,core-data,nsfetchedresultscontroller,Ios,Objective C,Core Data,Nsfetchedresultscontroller,my.h: @property(nonatomic, retain) NSManagedObjectContext *context; //Managed Object Context of CoreData. Passed from AppDelegate @property (nonatomic, retain) NSFetchedResultsController *fetchedResultsController; //FetchedResultsController for mana

my.h:

@property(nonatomic, retain) NSManagedObjectContext *context;
//Managed Object Context of CoreData. Passed from AppDelegate

@property (nonatomic, retain) NSFetchedResultsController *fetchedResultsController;
//FetchedResultsController for managing fetched objects from coreData.
- (NSNumber *) customMethod
{

    NSError *error;
    if ([[self fetchedResultsController] performFetch:&error]) 
    {
      return @1;
    }
    else
    {
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    }
    return @0;
}

- (NSFetchedResultsController *)fetchedResultsController
{

    if (self.fetchedResultsController != nil)  //Here it throws EXC_BAD_ACCESS(code=2)
      //If used _fetchedResultsController, works fine
    {
        return self.fetchedResultsController;
    }

    //custom code to create FetchResultController.

   return _fetchedResultsController;

}
my.m:

@property(nonatomic, retain) NSManagedObjectContext *context;
//Managed Object Context of CoreData. Passed from AppDelegate

@property (nonatomic, retain) NSFetchedResultsController *fetchedResultsController;
//FetchedResultsController for managing fetched objects from coreData.
- (NSNumber *) customMethod
{

    NSError *error;
    if ([[self fetchedResultsController] performFetch:&error]) 
    {
      return @1;
    }
    else
    {
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    }
    return @0;
}

- (NSFetchedResultsController *)fetchedResultsController
{

    if (self.fetchedResultsController != nil)  //Here it throws EXC_BAD_ACCESS(code=2)
      //If used _fetchedResultsController, works fine
    {
        return self.fetchedResultsController;
    }

    //custom code to create FetchResultController.

   return _fetchedResultsController;

}
据我所知,self.var和_-var的区别是:

  • var是调用getter和setter的访问器引用
  • _var是一个直接访问器引用,它跳过了对getter和setter的调用

我无法从这个理由中找到我问题的线索。有人能解释一下这个场景吗?

您的自定义方法声明返回void,但您返回的是指向NSNumber的指针。当方法返回时,此对象将被释放,指针将无效

自我。fetchedResultsController变为[自fetchedResultsController]。所以您递归地调用这个方法。在访问器中,您应该访问_fetchedResultsController实例变量,而不是使用点语法调用该方法

您应该这样做:

- (NSFetchedResultsController *)fetchedResultsController
{

    if (_fetchedResultsController != nil)  //Here it throws EXC_BAD_ACCESS(code=2)
      //If used _fetchedResultsController, works fine
    {
        return _fetchedResultsController;
    }

    //custom code to create FetchResultController.

   return _fetchedResultsController;

}

顺便说一下,如果您还不清楚这一点,那么使用核心数据可能是一项非常艰巨的任务,尽管您非常勇敢:)。

您的自定义方法声明返回void,但您返回的是指向NSNumber的指针。当方法返回时,此对象将被释放,指针将无效

自我。fetchedResultsController变为[自fetchedResultsController]。所以您递归地调用这个方法。在访问器中,您应该访问_fetchedResultsController实例变量,而不是使用点语法调用该方法

您应该这样做:

- (NSFetchedResultsController *)fetchedResultsController
{

    if (_fetchedResultsController != nil)  //Here it throws EXC_BAD_ACCESS(code=2)
      //If used _fetchedResultsController, works fine
    {
        return _fetchedResultsController;
    }

    //custom code to create FetchResultController.

   return _fetchedResultsController;

}

顺便说一句,如果您还不清楚这一点,那么使用核心数据可能是一项非常艰巨的任务,尽管您非常勇敢:)。

尝试在nil检查中以及在非nil范围内的返回中使用_fetchedResultsController。否则,您将重复调用您定义的方法,而不是属性


确保您了解setter和getter是如何由属性生成的。

尝试在nil检查中以及在非nil的返回中使用_fetchedResultsController。否则,您将重复调用您定义的方法,而不是属性


确保您了解setter和getter是如何由属性生成的。

我发现这是一个非常有启发性的错误。基本上

 - (NSFetchedResultsController *)fetchedResultsController {}
是fetchedResultsController属性的getter。及

if(self.fetchedResultsController) {}
是一个测试,以查看是否已设置fetchedResultsController(!=nil)。这通常是我们测试是否设置了属性的方法。我们问getter它是否为零。然而,问题是我们正试图在fetchedResultsController的getter中实现这一点!因此,我们询问getter是否已设置,它是否运行我们的请求所在的方法。它运行getter并再次到达测试,该测试询问getter是否已设置fetchedResultsController属性。这个循环将无限期地继续下去,但编译器很友好,在循环一段时间后崩溃,这对我们很有帮助。询问访问器是否设置了fetchedResultsController是没有用的,而不是从getter内部。因为如果设置了变量,它就会设置它的backing实例变量,所以我们要求这样做。


通常我们不应该直接访问IVAR。这是一个例外。初始化是另一个例外。原因是,如果自我还不存在,我们就不应该提及自我。无论如何,我觉得它很有启发性。

我发现这是一个非常有启发性的错误。基本上

 - (NSFetchedResultsController *)fetchedResultsController {}
是fetchedResultsController属性的getter。及

if(self.fetchedResultsController) {}
是一个测试,以查看是否已设置fetchedResultsController(!=nil)。这通常是我们测试是否设置了属性的方法。我们问getter它是否为零。然而,问题是我们正试图在fetchedResultsController的getter中实现这一点!因此,我们询问getter是否已设置,它是否运行我们的请求所在的方法。它运行getter并再次到达测试,该测试询问getter是否已设置fetchedResultsController属性。这个循环将无限期地继续下去,但编译器很友好,在循环一段时间后崩溃,这对我们很有帮助。询问访问器是否设置了fetchedResultsController是没有用的,而不是从getter内部。因为如果设置了变量,它就会设置它的backing实例变量,所以我们要求这样做。


通常我们不应该直接访问IVAR。这是一个例外。初始化是另一个例外。原因是,如果自我还不存在,我们就不应该提及自我。无论如何,我觉得它很有启发性。

不,我错把它写在这里了。检查问题。你的第二点是答案。属性和方法的名称相同。塔克斯。这是一个愚蠢的错误&我把它当成了一个大问题。谢谢……)伟大的重要的一点是永远不要访问getter、setter、dealloc和init方法之外的ivar,除非您有很好的理由。原因是在访问器本身中调用访问器方法可能会得到递归,当在init和dealloc方法中调用访问器时,您分别在尚未完全初始化或正在销毁的对象上调用方法。另外,这些不是您想要触发KVO通知的时间。不,我错把它写在这里了。检查问题。你的第二点是答案。属性和方法的名称相同。塔克斯。这是一个愚蠢的错误&我把它当成了一个大问题。谢谢……)伟大的重要的一点是永远不要访问getter、setter、dealloc和init方法之外的ivar,除非您有很好的理由。原因是在访问器本身中调用访问器方法可能会得到递归,当在init和dealloc方法中调用访问器时,您分别在尚未完全初始化或正在销毁的对象上调用方法。此外,您不希望在这些时间触发KVO通知。