ios – 在子类中更改访问器方法时,必须绕过@synthesize

我有几个UITableViewControllers,并希望它们都有几个属性,如fetchedResultsController和managedObjectContext.所以我为所有这些做了一个抽象类,这样我就可以添加这些常用属性,并符合某些协议(例如我遇到的其他协议),并为所有这些类似的TVC更改/添加任何代码.我在这个抽象类的标题中定义了一个名为fetchedResultsController的属性:

@property(强,非原子)NSFetchedResultsController * fetchedResultsController;

在我的抽象类的每个子类中,我想为这个属性创建一个自定义的getter来懒惰地实例化fetchedResultsController并初始化获取请求等.我发现我必须添加:

@synthesize fetchedResultsController = _fetchedResultsController;

每个子类都有一个iVar来制作getter.

我的问题:

为什么我在抽象类的每个子类中都看不到属性的iVars?

或者换句话说:

有没有办法为超类中定义的属性制作自定义访问器方法而无需@synthesize iVar?

最佳答案 ivars是定义属性的类的私有(并合成ivar).子类无权访问其父类的私有ivars.这是好事.

为什么不在你的子类中这样的东西(而不是让每个子类调用@synthesize):

Subclass.m

- (NSFetchedResultsController *)fetchedResultsController {
    NSFetchedResultsController *result = [super fetchedResultsController];
    if (!result) {
        result = ... // lazy load your controller
        [super setFetchedResultsController:result];
    }

    return result;
}

现在,子类不需要访问父类的私有ivar.

如果您的子类也覆盖了setter,则可能需要在调用setFetchedResultsController时调用self而不是super.

点赞