关于ios:继承属性并在Objective-C中进行合成

Inherited properties and synthesizing in Objective-C

我有以下类和子类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@interface NSHigh : NSObject
@property (nonatomic, strong) NSArray *array;
@end
@implementation NSHigh
-(NSArray*)array
{
    _array = [[NSArray alloc] init];
    return _array;
}
@end

@interface NSLow : NSHigh
@end
@implementation NSLow
/* synthesizing makes the assertion FAIL. NO synthesizing makes the assertion PASS */
@synthesize array;
@end

然后我在某个地方运行此代码:

1
2
NSLow *low = [[NSLow alloc] init];
assert(low.array);

显然,如果在子类NSLow中,我合成了数组属性,那么就不会调用超级类的getter,断言也会失败。

如果不进行合成,则调用超类getter,断言通过。

  • 为什么会这样?
  • 在不每次调用self.array的情况下,如何访问NSLow子类中的数组实例变量?

  • @synthesizeNSLowwill create下面的接收: </P >

    1
    2
    3
    - (NSArray *)array {
        return _array;
    }

    所以,你是永远不会主动阵列和nil是returned。。。。。。。 </P >

    你不generally"的使用方法,这是@synthesize@propertiesdeclared在一superclass。。。。。。。 </P >

    也,你不必执行T A接收一个在NSHigh状。如果你想,你lazily array init应该这样做的: </P >

    1
    2
    3
    4
    5
    6
    - (NSArray *)array {
        if (!_array) {
            _array = [[NSArray alloc] init];
        }
        return _array;
    }

    finally,你根本不应该使用NST字头。 </P >

    编辑: </P >

    如果你想直接访问你的好,在subclass,你可以explicitly declare它的头,这样: </P >

    1
    2
    3
    4
    5
    @interface NSHigh : NSObject {
        NSArray *_array;
    }
    @property (nonatomic, strong) NSArray *array;
    @end

    这将允许你访问到的是在你的subclasses太。。。。。。。 </P >