Objective-C的:覆盖超类getter和试图访问时,伊娃编译器错误(Objective-C:

2019-07-03 10:08发布

我正在建设的iOS 6应用程序。

我有一个类TDBeam从超TDWeapon继承。

TDWeapon声明中TDWeapon.h文件@property:

@interface TDWeapon : UIView

@property (nonatomic) int damage;

@end

我没有明确的@synthesize属性,我让Xcode的自动这么做。

在子类中TDBeam我覆盖在TDBeam.m文件,吸气:

#import "TDBeam.h"

@implementation TDBeam

- (int)damage {
    return _damage;
}

@end

Xcode的自动完成的getter方法名,符合市场预期。 但是,当我试图引用_DAMAGE实例变量(从超类继承),我得到一个编译错误:

Use of undeclared identifier '_damage'

我在做什么错在这里? 我试着明确添加@synthesize,并改变_DAMAGE伊娃的名字,但是编译器不“看”或将其从超类的任何其他的ivars。 我以为实例变量是可见的,并从子类访问?

Answer 1:

高德合成是可见的子类,无论是显式或自动创建: 什么是@synthesized实例变量的知名度? 由于它们在实现文件有效宣称,他们的声明是不包括在“翻译单元”,包括子类。

如果你真的想直接访问实例变量,你必须明确声明它(在其默认的“保护”的形式)的某处子类可以看到它,如类扩展超类的私有头。



Answer 2:

有很多关于堆栈溢出,其中没有提供简单的具体建议这个话题的帖子,但这个主题概括起来最简洁,和Josh的答案是任何最好的。

他还挺停止短说彻底的是,如果这是那种你想要做的,不要用@property在所有的事情。 声明你的常规保护变量在你的基类,他说,写你自己的getter和setter方法,如果你需要他们。 伊娃将是任何子类那么谁可以写自己制​​定者/吸气可见。

至少,在那里我已经降落在这个问题上,虽然我倒是总福利局到子类。

创建私有头托管您的匿名类和再@在你的子类综合中的高德的想法似乎只是错在很多层面上。 我也相信我可能已经错过了一些根本的一点地方。


编辑

好了一些后失去的睡眠,并激发了斯坦福大学2013年的iTunes U课程 ,在这里,我相信这是一个例子解决了这个问题。

MYFoo.h

#import <Foundation/Foundation.h>

@interface MYFoo : NSObject
// Optional, depending on your class
@property (strong, nonatomic, readonly) NSString * myProperty;
- (NSString *)makeValueForNewMyProperty; //override this in your subclass
@end

MYFoo.m

#import "MYFoo.h"

@interface MYFoo ()
   @property (strong, nonatomic, readwrite) NSString * myProperty;
@end

@implementation MYFoo
// Base class getter, generic
- (NSDateComponents *)myProperty {
    if (!_myProperty) {
        _myProperty = [self makeValueForNewMyProperty];
    }
    return _myProperty;
}


// Replace this method in your subclass with your logic on how to create a new myProperty
- (NSString *)makeValueForNewMyProperty {
    // If this is an abstract base class, we'd return nil and/or throw an exception
    NSString * newMyProperty = [[NSString alloc]init];
    // Do stuff to make the property the way you need it...
    return newMyProperty;
}

@end

然后,你只需更换makeValueForNewMyProperty在任何你需要的自定义逻辑的子类。 你的财产是在基类“保护”,但你必须在它是如何创建的,这是你想在大多数情况下,实现基本上是控制。

如果您makeValueForNewMyProperty方法需要访问的基类的其他实例变量,他们将在最起码,必须是公共的只读属性(或只是赤裸裸的ivars)。

不完全是“过度摆脱一个getter”,但它实现了同样的事情,有一点想法。 我的道歉,如果,在试图让这个例子通用,一些优雅和清晰度已丢失。



文章来源: Objective-C: Compiler error when overriding a superclass getter and trying to access ivar