GCC与现代Clang编译器下使用Objective-C的差异

Objective-C自上世纪80年代发展到至今(2018年)已经有30多年了。目前Objective-C的版本相比于其他一些经典的主流编程语言(Java、Python等)还是有些碎的。目前对Objective-C的进化起带头作用的仍然是Apple Inc.公司,而LLVM-Clang编译器也能支持不少现代化的Objective-C语法特性,详细请见:自Objective-C 2.0以来的新增语法特性。而GCC从4.2之后就基本中断了对Objective-C的升级,当前这里主要是指gobjc编译器,我们在除Apple以外的其他类Unix系统上主要使用的GNUStep还是在不断升级中,尤其是配合Clang对Objective-C的新增语法支持所新增的一些方法接口。

笔者撰写本文的目的是为了提醒Objective-C程序员,如果自己所写的代码想在其他类Unix上使用GCC+GNUStep进行编译运行的话所需要注意的一些事项。尽管GCC4.2比较老了,但是还是有不少开发环境、硬件平台不得不使用GCC,因为LLVM-Clang目前所能支持的处理器架构仍然不多,基本都属主流处理器架构。所以在其他一些小众平台上开发,那我们倘若没能力自己修改Clang代码进行适配的话,那么只能使用GCC了。

下面,我先给出GNUStep的官方API参考文档,GNUStep中的Base类库与Apple自家的Cocoa Framework中的Foundation类库大部分都能兼容,就是有些类的方法可能会稍微有些差异,我们在具体使用过程中如果遇到编译报错,可以进行参考:GNUstep Base。下面就开始我们的话题。

1、GCC中的Objective-C不能进行自动synthesize,因此如果我们要声明一个property并且不想自己实现其getter与setter方法的话就需要自己写@synthesize。此外,我们还需要在类中声明使用此property所对应的成员变量。

2、GCC中的Objective-C,Category不能声明成员变量,只能声明方法与property。再结合第一条,如果我们在Category中声明了一个property,并且在类中没有声明此property对应的成员变量,那么我们只能手动实现其getter与setter方法。

3、其实在比较早的Objective-C中就已经把“点语法”扩展得比较深了。这意味着,即便在一个类中没有声明某个property,但是有符合getter/setter命名规则的方法在,那么我们就可以使用点语法。不过这里需要注意的是,在GCC中比较有意思,如果一个类的类方法的返回类型是id,那么用该类通过点语法去访问该类方法的结果不能作为消息接受者!

4、GCC中的Objective-C,对于在类的实现中所定义的内部方法,它们必须要放在调用这些方法的方法之前,否则的话编译器会有warning提示消息可能无法响应。或者可以用私有Category进行在先声明。

如果大家不能一下子明白上述几点的具体使用场景,那么我将使用一个简单的demo进行解答:

#import <Foundation/Foundation.h>

@interface MyObject : NSObject
{
@private
    
    /// 这里必须显式声明string实例属性,
    /// 以提供手工synthesize的能力。
    NSString *string;
}

@property (nonatomic, retain) NSString *string;

- (void)testMethod;

+ (id)classMethod;

@end

@protocol MyProt<NSObject>

- (void)testMethod;

@end

// GCC中Category也能实现协议
@interface MyObject()<MyProt>

/// GCC中,Category里也可以声明一个property
@property (nonatomic, readonly, assign) int theValue;

/// 通过扩展声明innerMethod方法,
/// 这样可使得innerMethod能定义在MyObject中的任意空位
- (int)innerMethod;

@end


@implementation MyObject

@synthesize string;

- (void)dealloc
{
    self.string = nil;
    [super dealloc];
    
    NSLog(@"MyObject is destroyed!");
}

+ (id)classMethod
{
    return @"class method";
}

- (id)myself
{
    NSLog(@"This is myself!");
    return self;
}

- (void)testMethod
{
    NSUInteger length = self.string.length;
    
    length += [self.myself string].length;
    
    length += self.innerMethod;
    
    length += self.theValue;
    
    NSLog(@"length = %tu", length);
}

- (int)innerMethod
{
    return 100;
}

- (int)theValue
{
    return 10;
}

@end


int main(void)
{
    NSAutoreleasePool *pool = NSAutoreleasePool.new;
    
    MyObject *obj = MyObject.new;
    obj.string = @"Hello, world!";
    [obj testMethod];
    NSLog(@"The class method content is: %@", MyObject.classMethod);
    // 由于classMethod类方法返回的是id类型,
    // 因此这里不能直接使用[MyObject.classMethod length]这种调用方式。
    // 不过以下两种方式却都没问题。
    NSLog(@"The length is: %tu", [(NSString*)MyObject.classMethod length]);
    NSLog(@"The length is: %tu", [[MyObject classMethod] length]);
    [obj release];
    
    [pool drain];
}

上述代码简洁扼要地列出了大家在基于GCC编译器进行编写Objective-C时所需要注意的点。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,386评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,142评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,704评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,702评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,716评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,573评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,314评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,230评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,680评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,873评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,991评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,706评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,329评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,910评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,038评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,158评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,941评论 2 355

推荐阅读更多精彩内容