gpt4 book ai didi

objective-c - 在 Objective-C 中使用延迟加载覆盖属性 getter

转载 作者:太空狗 更新时间:2023-10-30 03:35:58 28 4
gpt4 key购买 nike

我通常像这样在他们的 getter 方法中懒惰地实例化我的@property 对象:

@interface MyGenericClass : UIViewController
@property(nonatomic, readonly) UIImageView *infoImageView
// ...

@implementation GenericClass

- (UIImageView *)infoImageView
{
if (!_infoImageView) {
_infoImageView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"PlaceholderInfoImage"]];
}
return _infoImageView;
}

但是在子类化时,我经常想重写一些@properties 以使其更特定于子类。所以我想改变实例化并做类似的事情:

@interface MySpecificSubclass : MyGenericClass
//...

@implementation MySpecificSubclass

- (UIImageView *)infoImageView
{
if (!_infoImageView) {
_infoImageView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"SpecialInfoImage"]];
}
return _infoImageView;
}

但这不可能,因为子类无法访问 _infoImageView iVar。

我想做的是糟糕的风格吗?还是对此有通用的解决方案/最佳实践?我看到的唯一解决方案是将 iVar 公开,这感觉就像违反封装原则......

感觉这是一个非常基本的问题,肯定已经有数百万个答案了,但搜索了几个小时后我只能找到 Objective-C: Compiler error when overriding a superclass getter and trying to access ivar, 但它没有提供解决方案。

最佳答案

您可能希望在头文件中将 _infoImageView 与属性一起声明为 protected 变量。另一个想法是创建一个公共(public)的 defaultImageView 方法来调用惰性 getter。像这样:

@interface MyGenericClass : UIViewController
@property (nonatomic, readonly) UIImageView *infoImageView

...

@implementation GenericClass

- (UIImageView *)infoImageView
{
if (!_infoImageView) {
_infoImageView = [self defaultImageView];
}
return _infoImageView;
}

- (UIImageView *)defaultImageView
{
return [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"PlaceholderInfoImage"]];
}

...

@interface MySpecificSubclass : MyGenericClass

...

@implementation MySpecificSubclass

- (UIImageView *)defaultImageView
{
return [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"SpecialInfoImage"]];
}

关于objective-c - 在 Objective-C 中使用延迟加载覆盖属性 getter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19276229/

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