了解子/父实例变量的范围

时间:2014-03-13 12:34:36

标签: objective-c ios7 parent-child scope instance-variables

我对子类的变量范围有疑问。

我有以下内容:

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]);
...

我做错了什么?

由于

2 个答案:

答案 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。您可能希望尝试记录实际的子类,并在实例化之后查看该对象是否存在(或设置断点并检查调试器)。这将告诉你问题是在实例化还是其他地方。

最有可能的是,实际代码中还有一些其他细节会导致问题。你认为不相关的东西实际上是问题。在发布问题之前我已经这样做了。我试图削减“残酷”并最终解决问题。您可能想尝试发布您的实际代码。