我对子类的变量范围有疑问。
我有以下内容:
ParentClass.h
@interface ParentClass : NSObject
@property (nonatomic, strong, readonly) NSString *myIdentifier;
- (id)initWithIdentifier:(NSString *)identifier;
@end
ParentClass.m
@interface ParentClass()
@property (nonatomic, strong) NSString *myIdentifier;
@end
@implementation ParentClass
- (id)initWithIdentifier:(NSString *)identifier {
if (self = [super init]) {
self.myIdentifier = identifier;
}
return self;
}
@end
ChildClass.h
@interface ChildClass : ParentClass
- (NSString *)showMeTheIdentifier;
@end
ChildClass.m
@implementation ChildClass
- (NSString *)showMeTheIdentifier {
return self.myIdentifier;
}
然后我去实现类,我没有得到编译器警告,但NSLog的结果是(null)
ViewController.m
...
ChildClass *c = [[ChildClass alloc] initWithIdentifier:@"abc123"];
NSLog(@"What's my identifier? %@", [c showMeTheIdentifier]);
...
我做错了什么?
由于
答案 0 :(得分:1)
您可以删除私有类别中的属性声明,并执行以下操作:
你没有在init中返回self。因此它不起作用。
- (id)initWithIdentifier:(NSString *)identifier {
self = [super init];
if(self) {
_myIdentifier = identifier;
}
return self;
}
答案 1 :(得分:1)
除了您的“伪代码”中有self == [super init]
而不是self = [super init]
这一事实(您将self
与[super init]
进行比较而不是分配它),一切都很好。如果您在实际代码中使用==
,则self会返回nil
。您可能希望尝试记录实际的子类,并在实例化之后查看该对象是否存在(或设置断点并检查调试器)。这将告诉你问题是在实例化还是其他地方。
最有可能的是,实际代码中还有一些其他细节会导致问题。你认为不相关的东西实际上是问题。在发布问题之前我已经这样做了。我试图削减“残酷”并最终解决问题。您可能想尝试发布您的实际代码。