【问题标题】:two classes, same property name, different type -> gets overridden两个类,相同的属性名称,不同的类型 -> 被覆盖
【发布时间】:2014-12-13 15:16:40
【问题描述】:

我有以下设置:两个类,一个导入另一个,两者都有一个属性恰好具有相同的名称但类型不同。

当我尝试访问 ClazzB 中的 someColor 属性时,出现错误:

[[[ClazzB sharedInstance] someColor] CGColor]

错误: 'NSString' 没有可见的@interface 声明选择器'CGColor'

错误清楚地表明它从 ClazzA 获取属性,问题是为什么?是否有一些奇怪的名字被覆盖了?

这里是设置:

@interface ClazzA : NSObject {
   @private
   NSString* _someColor;
}
@property (nonatomic, copy) NSString* someColor;

ClazzB 导入 ClazzA 并具有同名但类型不同的属性。

#import "ClazzA.h"

@interface ClazzB : NSObject {
    UIColor* _someColor;
}

@property (nonatomic, strong) UIColor* someColor;

非常感谢任何帮助!

谢谢!

【问题讨论】:

  • 你能显示你的“sharedInstance”方法的声明吗?
  • 这是一个单身人士。 + (id)sharedInstance { static ClazzB *sharedMyManager = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ sharedMyManager = [[self alloc] init]; }); return sharedMyManager; }
  • 如下所述。不要使用 id 作为此类方法的返回类型。

标签: ios xcode class overriding instance-variables


【解决方案1】:

上面我要求您提供sharedInstance 方法的共享声明,但我怀疑它是

+ (id)sharedInstance;

这是一个问题的原因。在这种情况下,编译器不知道您将到达那里的确切类型,而只是为someColor 选择第一个匹配的选择器,它返回NSString *

我建议将您的 sharedInstance 方法声明更改为

+ (instancetype)sharedInstance;

+ (ClazzA *)sharedInstance;
+ (ClazzB *)sharedInstance;

我更喜欢instancetype 方式。

【讨论】:

    猜你喜欢
    • 2018-08-31
    • 2019-09-29
    • 2019-04-23
    • 2019-06-12
    • 1970-01-01
    • 1970-01-01
    • 2015-04-09
    • 1970-01-01
    • 2018-07-26
    相关资源
    最近更新 更多