GCC與現(xiàn)代Clang編譯器下使用Objective-C的差異

Objective-C自上世紀(jì)80年代發(fā)展到至今(2018年)已經(jīng)有30多年了。目前Objective-C的版本相比于其他一些經(jīng)典的主流編程語言(Java罢屈、Python等)還是有些碎的后豫。目前對(duì)Objective-C的進(jìn)化起帶頭作用的仍然是Apple Inc.公司驯镊,而LLVM-Clang編譯器也能支持不少現(xiàn)代化的Objective-C語法特性燥狰,詳細(xì)請(qǐng)見:自O(shè)bjective-C 2.0以來的新增語法特性圈驼。而GCC從4.2之后就基本中斷了對(duì)Objective-C的升級(jí)梳码,當(dāng)前這里主要是指gobjc編譯器隐圾,我們?cè)诔鼳pple以外的其他類Unix系統(tǒng)上主要使用的GNUStep還是在不斷升級(jí)中,尤其是配合Clang對(duì)Objective-C的新增語法支持所新增的一些方法接口掰茶。

筆者撰寫本文的目的是為了提醒Objective-C程序員暇藏,如果自己所寫的代碼想在其他類Unix上使用GCC+GNUStep進(jìn)行編譯運(yùn)行的話所需要注意的一些事項(xiàng)。盡管GCC4.2比較老了濒蒋,但是還是有不少開發(fā)環(huán)境盐碱、硬件平臺(tái)不得不使用GCC,因?yàn)長(zhǎng)LVM-Clang目前所能支持的處理器架構(gòu)仍然不多沪伙,基本都屬主流處理器架構(gòu)瓮顽。所以在其他一些小眾平臺(tái)上開發(fā),那我們倘若沒能力自己修改Clang代碼進(jìn)行適配的話围橡,那么只能使用GCC了暖混。

下面,我先給出GNUStep的官方API參考文檔翁授,GNUStep中的Base類庫(kù)與Apple自家的Cocoa Framework中的Foundation類庫(kù)大部分都能兼容拣播,就是有些類的方法可能會(huì)稍微有些差異晾咪,我們?cè)诰唧w使用過程中如果遇到編譯報(bào)錯(cuò),可以進(jìn)行參考:GNUstep Base贮配。下面就開始我們的話題谍倦。

1、GCC中的Objective-C不能進(jìn)行自動(dòng)synthesize牧嫉,因此如果我們要聲明一個(gè)property并且不想自己實(shí)現(xiàn)其getter與setter方法的話就需要自己寫@synthesize剂跟。此外,我們還需要在類中聲明使用此property所對(duì)應(yīng)的成員變量酣藻。

2曹洽、GCC中的Objective-C,Category不能聲明成員變量辽剧,只能聲明方法與property送淆。再結(jié)合第一條,如果我們?cè)贑ategory中聲明了一個(gè)property怕轿,并且在類中沒有聲明此property對(duì)應(yīng)的成員變量偷崩,那么我們只能手動(dòng)實(shí)現(xiàn)其getter與setter方法。

3撞羽、其實(shí)在比較早的Objective-C中就已經(jīng)把“點(diǎn)語法”擴(kuò)展得比較深了阐斜。這意味著,即便在一個(gè)類中沒有聲明某個(gè)property诀紊,但是有符合getter/setter命名規(guī)則的方法在谒出,那么我們就可以使用點(diǎn)語法。不過這里需要注意的是邻奠,在GCC中比較有意思笤喳,如果一個(gè)類的類方法的返回類型是id,那么用該類通過點(diǎn)語法去訪問該類方法的結(jié)果不能作為消息接受者碌宴!

4杀狡、GCC中的Objective-C,對(duì)于在類的實(shí)現(xiàn)中所定義的內(nèi)部方法贰镣,它們必須要放在調(diào)用這些方法的方法之前呜象,否則的話編譯器會(huì)有warning提示消息可能無法響應(yīng)”。或者可以用私有Category進(jìn)行在先聲明董朝。

如果大家不能一下子明白上述幾點(diǎn)的具體使用場(chǎng)景,那么我將使用一個(gè)簡(jiǎn)單的demo進(jìn)行解答:

#import <Foundation/Foundation.h>

@interface MyObject : NSObject
{
@private
    
    /// 這里必須顯式聲明string實(shí)例屬性干跛,
    /// 以提供手工synthesize的能力。
    NSString *string;
}

@property (nonatomic, retain) NSString *string;

- (void)testMethod;

+ (id)classMethod;

@end

@protocol MyProt<NSObject>

- (void)testMethod;

@end

// GCC中Category也能實(shí)現(xiàn)協(xié)議
@interface MyObject()<MyProt>

/// GCC中祟绊,Category里也可以聲明一個(gè)property
@property (nonatomic, readonly, assign) int theValue;

/// 通過擴(kuò)展聲明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]這種調(diào)用方式。
    // 不過以下兩種方式卻都沒問題嘉熊。
    NSLog(@"The length is: %tu", [(NSString*)MyObject.classMethod length]);
    NSLog(@"The length is: %tu", [[MyObject classMethod] length]);
    [obj release];
    
    [pool drain];
}

上述代碼簡(jiǎn)潔扼要地列出了大家在基于GCC編譯器進(jìn)行編寫Objective-C時(shí)所需要注意的點(diǎn)遥赚。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市阐肤,隨后出現(xiàn)的幾起案子凫佛,更是在濱河造成了極大的恐慌,老刑警劉巖孕惜,帶你破解...
    沈念sama閱讀 221,820評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件愧薛,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡衫画,警方通過查閱死者的電腦和手機(jī)毫炉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來削罩,“玉大人瞄勾,你說我怎么就攤上這事∶旨ぃ” “怎么了进陡?”我有些...
    開封第一講書人閱讀 168,324評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)微服。 經(jīng)常有香客問我趾疚,道長(zhǎng),這世上最難降的妖魔是什么职辨? 我笑而不...
    開封第一講書人閱讀 59,714評(píng)論 1 297
  • 正文 為了忘掉前任盗蟆,我火速辦了婚禮,結(jié)果婚禮上舒裤,老公的妹妹穿的比我還像新娘喳资。我一直安慰自己,他們只是感情好腾供,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評(píng)論 6 397
  • 文/花漫 我一把揭開白布仆邓。 她就那樣靜靜地躺著,像睡著了一般伴鳖。 火紅的嫁衣襯著肌膚如雪节值。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,328評(píng)論 1 310
  • 那天榜聂,我揣著相機(jī)與錄音搞疗,去河邊找鬼。 笑死须肆,一個(gè)胖子當(dāng)著我的面吹牛匿乃,可吹牛的內(nèi)容都是我干的桩皿。 我是一名探鬼主播,決...
    沈念sama閱讀 40,897評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼幢炸,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼泄隔!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起宛徊,我...
    開封第一講書人閱讀 39,804評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤佛嬉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后闸天,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體暖呕,經(jīng)...
    沈念sama閱讀 46,345評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評(píng)論 3 340
  • 正文 我和宋清朗相戀三年号枕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了缰揪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,561評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡葱淳,死狀恐怖钝腺,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情赞厕,我是刑警寧澤艳狐,帶...
    沈念sama閱讀 36,238評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站皿桑,受9級(jí)特大地震影響毫目,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜诲侮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評(píng)論 3 334
  • 文/蒙蒙 一镀虐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧沟绪,春花似錦刮便、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至坝疼,卻和暖如春搜贤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背钝凶。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工仪芒, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,983評(píng)論 3 376
  • 正文 我出身青樓桌硫,卻偏偏與公主長(zhǎng)得像夭咬,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子铆隘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容