天天看點

Objective-C私有變量繼承問題

    寫這篇部落格之前,我得推薦一本書——Objective-C程式設計(第6版)英文版,也就是 Objective-C Programming (Sixth Edition)。

    感覺國内關于ObjC的入門書籍要麼寫的很爛,要麼翻譯的很爛。而這本書非常好,由淺及深。一定要看英文版,别看中文版。

    然後第二點推薦的就是用Mac OS自帶的clang編譯器在指令行中敲代碼編譯,這也是我的部門老大給我的建議,在初學的時候去工具化。是以我是用bash command line tool + clang compiler + vim editor. 配好vim後碼代碼的效果如下所示,全屏的!很炫酷!有木有!

Objective-C私有變量繼承問題

    好了,可以開始正文了。

    ObjC有個特性就是當你在接口中的變量前面加上關鍵字@property,并在實作中給這個變量加關鍵字@synthesize後,系統會自動給你設定好set方法。不過需要注意的是加關鍵字後變量變成了私有的了。

    那麼問題來了,如果在父類中被關鍵字聲明的變量x,我要在子類中使用它怎麼破?

    一開始我直接用x來引用,結果不行。

    不過我後來聯想到C++,然後使用super.x就可以引用到父類變量了,或者用self.x也行。

    具體看代碼如下:

#import <Foundation/Foundation.h>

@interface ClassA: NSObject
@property int x;
-(int) getX: (int) d;
@end

@implementation ClassA
@synthesize x;
-(int) getX: (int) d
{
  return x;
}
@end

@interface ClassB: ClassA
-(void) print;
@end

@implementation ClassB
-(void) print
{
  NSLog(@"%i", super.x); // self.x or super.x is both OK
}
@end

int main(int argc, char *argv[])
{
  @autoreleasepool {
    ClassB *b = [[ClassB alloc] init];
    [b setX: 100];
    [b print];
  }
  return 0;
}