gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 05:54:54 27 4
gpt4 key购买 nike

我有几个 UITableViewController,并希望它们都具有多个属性,例如 fetchedResultsController 和 managedObjectContext。所以我为所有这些创建了一个抽象类,这样我就可以一次添加这些公共(public)属性,并符合某些协议(protocol)(例如和我遇到的其他协议(protocol))并为所有这些类似的 TVC 更改/添加任何代码。我在这个抽象类的 header 中定义了一个名为 fetchedResultsController 的属性:

@property (strong, nonatomic) NSFetchedResultsController *fetchedResultsController;

在我的抽象类的每个子类中,我想为此属性创建一个自定义 getter 以延迟实例化 fetchedResultsController 并初始化获取请求等。我发现我必须添加:

@synthesize fetchedResultsController = _fetchedResultsController;

每个子类都有一个 iVar 来做 getter。

我的问题:

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

或者换句话说:

有没有办法为父类(super class)中定义的属性创建自定义访问器方法,而无需 @synthesize iVar?

最佳答案

ivars 对于定义属性(并合成 ivar)的类是私有(private)的。子类无权访问其父类的私有(private) ivar。这是好事。

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

子类.m

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

return result;
}

现在子类不需要访问父类的私有(private)ivar

如果你的子类也覆盖了setter,你可能想调用self而不是 super正在调用 setFetchedResultsController: .

关于ios - 在更改子类中的访问器方法时绕过必须@synthesize,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20307335/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com