亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Swift > 正文

簡單分析Swift語言的一些基本特征

2020-03-09 17:50:14
字體:
供稿:網(wǎng)友
這篇文章主要介紹了Swift語言的一些基本特征,本文從各語言最基礎(chǔ)的類與對象等方面來講,需要的朋友可以參考下
 

Swift是蘋果公司最新推出的編程語言,據(jù)很多人說,是用來”代替“Objective-C。但是沒有確切的證據(jù)。我花了一些時(shí)間對Swift二進(jìn)制和運(yùn)行環(huán)境實(shí)施逆向工程技術(shù),然后我對Swift有些少許的發(fā)現(xiàn)。目前為止,結(jié)論就是:Swift是沒有消息機(jī)制的Objective-C。

對象

信不信由你,Swift中的對象就是Objective-C的對象。在Mach-O二進(jìn)制文件中,__objc_classlist包含每個(gè)二進(jìn)制文件中類的數(shù)據(jù)。其結(jié)構(gòu)如下所示:
 

復(fù)制代碼代碼如下:

struct objc_class {
    uint64_t isa;
    uint64_t superclass;
    uint64_t cache;
    uint64_t vtable;
    uint64_t data;
};

 

(注:所有結(jié)構(gòu)都來自64位版本)

注意data記錄,它指向了類中的一個(gè)列出方法、實(shí)例變量和協(xié)議等內(nèi)容的結(jié)構(gòu)體。通常,data是8個(gè)字節(jié)對齊的,但是對于Swift類,data的最后一位僅為1個(gè)字節(jié)。


Swift類的真正結(jié)構(gòu)是有一點(diǎn)奇怪的。Swift類沒有Objective-C方法。我們將在以后實(shí)現(xiàn)它。Swift類的變量存儲為實(shí)例變量。Swift的getter和setter方法真正修改的是實(shí)例變量的值。奇怪的是swift類的實(shí)例變量沒有類型編碼。通常應(yīng)該指向類型編碼的指針為NULL。這大概是由于事實(shí)上Objective-C運(yùn)行時(shí)是不支持處理Swift變量本身。

繼承

Swift的繼承是你所期待的。在Swift中,Square是shape的子類也是Objective-C類Shape的子類。然而,在Swift類中沒有超類?

例如

 

復(fù)制代碼代碼如下:
class Shape { }

 

在這個(gè)例子中,Shape類是SwiftObject的子類。SwiftObject是一個(gè)根Objective-C類,類似于NSObject。它沒有超類,意味著isa指向自身。它的目的是使用Swift運(yùn)行時(shí)方法比如allocation和deallocation代替標(biāo)準(zhǔn)的Objective-C運(yùn)行時(shí)方法。例如,(void)retain不會(huì)調(diào)用objc_retain,但是它會(huì)調(diào)用swift_retain。

類方法

就像我之前提到的,Swift對象的類沒有方法,以此代替的是類似C++的函數(shù),名稱改編和所有東西。這可能是為什么Swift聲稱比Objective-C更快的原因。不再需要為 objc_msgSend  尋找和調(diào)用方法實(shí)現(xiàn)。

在Objective-C里面,方法像這樣實(shí)現(xiàn):

 

復(fù)制代碼代碼如下:
type method(id self, SEL _cmd, id arg1, id arg2, ...)

 

Swift 方法非常類似,但是輕微使用了不同的參數(shù)排布, self 作為最后一個(gè)參數(shù)傳遞,并且沒有選擇器。

 

復(fù)制代碼代碼如下:
type method(id arg1, id arg2, ..., id self)

 


虛表

類似C++一樣,Swift類也具有一個(gè)虛表,用于列出類中的方法。它直接被放置在二進(jìn)制文件中的類數(shù)據(jù)之后,并且看起來是這樣的:
 

復(fù)制代碼代碼如下:

struct swift_vtable_header {
    uint32_t vtable_size;
    uint32_t unknown_000;
    uint32_t unknown_001;
    uint32_t unknown_002;
    void* nominalTypeDescriptor;
    // vtable pointers
}

 

據(jù)我所知,Swift類中的虛表僅在編譯期間可見時(shí)被使用。否則,它將看起來就是一堆亂糟糟的符號。

命名重整

Swift保持函數(shù)的元數(shù)據(jù)在各自的符號,這就叫做命名重整。元數(shù)據(jù)寶庫奧函數(shù)的名稱(顯而易見的),屬性,模塊名稱,參數(shù)類型,返回值類型,還有更多的數(shù)據(jù),例如這個(gè)例子
 

復(fù)制代碼代碼如下:

class Shape{
    func numberOfSides() -> Int {
        return 5
    }
}

 

simpleDescription方法的重整命名是:

_TFC9swifttest5Shape17simpleDescriptionfS0_FT_Si。下面是詳細(xì)說明:

_T - 所有Swift符號的前綴,每一個(gè)符號都是從_T開始。

F - 函數(shù)

C - 類的函數(shù)(方法)

9swifttest - 帶有長度前綴的模塊名

5Shape - 函數(shù)所屬的類,帶有長度前綴

17simpleDescription - 函數(shù)名

f - 函數(shù)屬性。 在這個(gè)例子中它是f,這是一個(gè)普通函數(shù)。

S0_FT- 我不是特別確定這是什么意思,但是它是參數(shù)和返回類型開始的標(biāo)記

‘_' - 這個(gè)下劃線分割了參數(shù)和返回值的類型。因?yàn)楹瘮?shù)沒有帶參數(shù),它直接跟在了S0_FT的后面

S - 返回值的開始。'S'代表Swift;返回類型是Swift的內(nèi)建類型,下一個(gè)字符決定了類型

i - 這是Swift的內(nèi)建類型。一個(gè)小寫的"I"代表了Int.


函數(shù)屬性

字符類型

f        普通函數(shù)

s        setter

g        getter

d        析構(gòu)函數(shù)

D        釋放器

c        構(gòu)造函數(shù)

C        分配器

Swift內(nèi)部函數(shù)

字符類型

a        數(shù)組

b        布爾型

c        字符常量

d        雙精度浮點(diǎn)數(shù)

f        單精度浮點(diǎn)型

i        整型

u        UInt類型

Q        隱式可選

S        字符串型

除了函數(shù)之外,還有很多命名轉(zhuǎn)換機(jī)制,此處我僅給出一個(gè)簡短的概述。

掛鉤函數(shù)

受夠了語義這部分,讓我們接觸點(diǎn)有趣的東西!比方說我們有一個(gè)像這樣的類:
 

復(fù)制代碼代碼如下:

class Shape {
    var numberOfSides: Int;
 
    init(){
        numberOfSides = 5;
    }
}

 

比如我們想將numberOfSides的值改為4,很多種方法可以做到。我們可以使用MobileSubstrate掛到getter方法中,然后更改返回值,就像這樣:

 

復(fù)制代碼代碼如下:

int (*numberOfSides)(id self);
 
MSHook(int, numberOfSides, id self){
    return 4;
}
 
%ctor{
    numberOfSides = (int (*)(id self)) dlsym(RTLD_DEFAULT, "_TFC9swifttest5Shapeg13numberOfSidesSi");
    MSHookFunction(numberOfSides, MSHake(numberOfSides));
}

 

如果我們創(chuàng)建了一個(gè)形狀的實(shí)例,并且打印出numberOfSides的值,我們得到了4!看起來不錯(cuò),對不?現(xiàn)在,我知道你可能在想,難道我們不應(yīng)該是返回一個(gè)對象而非常量4嗎?


好吧,在Swift里,許多內(nèi)建類型是書面量來的。一個(gè)Int型, 舉個(gè)例子,和C語言里面的int型一樣(盡管它可以是一個(gè)長整形——不要讓我碰到這種情況)。一個(gè)小小的提示,String 類型有點(diǎn)古老,這是一個(gè)低位優(yōu)先的UTF-16字符串,所以沒有C的字面量能用。

讓我們來做同樣的事情,但這一次,我們不是在獲取器上,而是在獲取器上設(shè)鉤。

 

復(fù)制代碼代碼如下:

void (*setNumberOfSides)(int newNumber, id self);
 
MSHook(void, setNumberOfSides, int newNumber, id self){
    _setNumberOfSides(4, self);
}
 
%ctor {
    setNumberOfSides = (void (*)(int newNumber, id self)) dlsym(RTLD_DEFAULT, "_TFC9swifttest5Shapes13numberOfSidesSi");
    MSHookFunction(setNumberOfSides, MSHake(setNumberOfSides));
}

 

再嘗試一下,然后。。。。。。還是5。怎么回事,你問?好吧,在Swift里某些地方,函數(shù)是內(nèi)聯(lián)化的。類構(gòu)造器就是其中一個(gè)的地方。它直接設(shè)置numberOfSides 為ivar, 設(shè)置器將僅在數(shù)值再次被頂層代碼設(shè)置的時(shí)候被調(diào)用。在那被調(diào)用,你知道么,我們得到了4。

最終,讓我們通過直接設(shè)置實(shí)例變量的值來修改numberOfSides。

 

復(fù)制代碼代碼如下:

void (*setNumberOfSides)(int newNumber, id self);
 
MSHook(void, setNumberOfSides, int newNumber, id self){
    MSHookIvar<int>(self, "numberOfSides") = 4;
}
 
%ctor {
    setNumberOfSides = (void (*)(int newNumber, id self)) dlsym(RTLD_DEFAULT, "_TFC9swifttest5Shapes13numberOfSidesSi");
    MSHookFunction(setNumberOfSides, MSHake(setNumberOfSides));
}

 

這個(gè)函數(shù)是可以實(shí)現(xiàn)功能的,雖然不建議這樣做,但是確實(shí)有效果。

這是目前我所要寫的內(nèi)容。當(dāng)然,還有很多其他的內(nèi)容我正在看,包括witness表,由于我了解不多,所以這里我也沒辦法寫出總結(jié)。很多內(nèi)容在這篇文章里有變更,他們僅是我目前對運(yùn)行和查看用Swift語言編譯的二進(jìn)制文件逆向工程操作所得到的東西。

我所發(fā)現(xiàn)的東西應(yīng)該是非常不錯(cuò)的,這意味著MobileSubstrate不會(huì)隨著Objective-C一同消亡,并且,微調(diào)仍然可以進(jìn)行!我很想知道將來在越獄場景下的應(yīng)用商店中將會(huì)是怎樣一番情景……難道logo可以更新用來自動(dòng)銷毀命名?甚至是處理常見的 Swift 類型的庫……

如果你發(fā)現(xiàn)更多的關(guān)于Swift如何工作的東西,不要猶豫,請讓我知道!



注:相關(guān)教程知識閱讀請移步到swift教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
九九精品久久久| 欧美a级成人淫片免费看| 精东粉嫩av免费一区二区三区| 欧美日本不卡| 欧美日韩视频一区二区| 欧美成人午夜激情视频| 天堂网一区二区三区| 欧美色图中文字幕| 亚洲综合图片一区| 精品久久久三级丝袜| 久久大胆人体视频| 欧美中文在线字幕| 久久综合成人精品亚洲另类欧美| 午夜在线成人av| 欧美精品久久久久久久久久丰满| 羞羞色午夜精品一区二区三区| 一区二区成人在线| 香蕉久久夜色精品国产更新时间| 国内精品美女av在线播放| 粉嫩精品久久99综合一区| 亚洲欧美制服第一页| 亚洲综合国产精品| 污污视频免费看| 国产精品日韩专区| 成人免费91| 日本fc2在线观看| 欧美男人操女人视频| 一本久道久久综合无码中文| 成人免费在线| 国产精品色婷婷在线观看| 国产精品久久久久久久午夜片| 日韩欧美黄色影院| 欧美成人免费看| 亚洲欧洲午夜一线一品| 亚洲一区二区自拍偷拍| 小早川怜子痴女在线精品视频| 青青草原综合久久大伊人精品优势| 日韩网站免费观看| 亚乱亚乱亚洲乱妇| 亚洲**2019国产| 天海翼一区二区三区免费| gay欧美网站| 欧美www在线观看| 日韩一区二区三区在线观看视频| 狠狠色噜噜狠狠狠狠97| 日本国产欧美| 女明星视频黄又免费| 国产在线精品播放| 久久www视频| 玖玖爱在线观看| 欧美人动与zoxxxx乱| 色网视频在线| 成人精品在线播放| 日韩免费电影一区二区三区| 91视频免费在观看| 久久久久久天堂| 国产福利视频导航| 波多野结衣电影免费观看| 91美女片黄在线观看91美女| 69av自拍偷拍| 麻豆精品一区二区| 久久综合一区二区三区| 9lporm自拍视频区在线| 欧美一区二区私人影院日本| 亚洲欧洲综合另类在线| 国内精久久久久久久久久人| 亚洲色图欧美| 国产在线精品二区| 国产成人香蕉在线视频fuz| av在线日韩| 久久福利网址导航| 黄上黄在线观看| 亚洲四色影视在线观看| 精品国产老师黑色丝袜高跟鞋| 国产精品丝袜一区| 久久人人99| 伊人久久中文字幕| 美女被内谢流白浆高视频| 黄色av一区二区| 成人精品视频一区二区| 国产在线一区二区综合免费视频| 私人高清影院 强乱中文字| 久久丁香综合五月国产三级网站| 国产高潮呻吟久久久| 九九热这里只有精品免费看| 高清毛片aaaaaaaaa片| 中文字幕在线播放| 国产午夜精品久久久久| 特级特黄刘亦菲aaa级| 少妇太紧太爽又黄又硬又爽| 久久久久久av无码免费看大片| 懂色av蜜臀av粉嫩av分享吧| 久久久午夜精品理论片中文字幕| 日产日韩在线亚洲欧美| 亚洲欧洲xxxx| 中文字幕在线中文字幕在线中三区| 999久久久久| 久久国产在线视频| 喜爱夜蒲2在线| 一二三在线视频社区| 97人人模人人爽人人喊中文字| 天天草夜夜操| 亚洲精品tv久久久久久久久| 欧美孕妇与黑人巨交| 精品一区二区成人精品| www.操操操| 欧美xxxx黑人又粗又长密月| 欧美日韩国产高清视频| 国产一区二区三区的电影| 欧美韩日一区二区三区| 亚洲欧美综合乱码精品成人网| 四虎影视一区二区| 日韩电影免费在线看| 国产影视一区| 综合激情网五月| 亚洲激情在线激情| 玩弄japan白嫩少妇hd| 国产精品亚洲第一| 小说区乱图片区| 在线观看免费一区二区| 欧美精品久久久久久久久46p| 国产高清欧美| 91国偷自产一区二区使用方法| 中文字幕黄色av| 99麻豆久久久国产精品免费优播| 黄色91在线观看| 正在播放国产对白害羞| 日韩欧美在线网站| 在线免费看av| 日韩一级片av| 亚洲欧美一区二区不卡| 国产精品粉嫩| 精品无人区太爽高潮在线播放| 九九热青青草| 69堂精品视频在线播放| 无码人妻精品一区二区50| 99精品视频在线看| 日韩一级特黄| 久久精品国产77777蜜臀| 日韩一级免费视频| 生活片a∨在线观看| 麻豆视频免费在线播放| 亚洲一区二区视频| 色视频www在线播放国产人成| 亚洲午夜精品一区 二区 三区| 免费影院在线观看一区| 亚洲人成网址| www.日本xxxx| 99re6热在线精品视频播放速度| 日韩美女视频一区| 久久91精品国产91久久小草| 久久99导航| 在线看片你懂的| 国产免费一区二区三区网站免费| 国产午夜精品理论片| gogogo高清免费观看在线视频| 久久久久9999亚洲精品| 182tv在线播放| 久久久久久久久久久妇女| 丁香五月缴情综合网| 亚洲国模精品私拍| 日韩精品导航| 欧美亚洲另类久久综合| 欧美日韩精品一区二区三区四区| 精品国产一区二区三区麻豆免费观看完整版| 国产深夜精品| 黄色一级在线视频| 亚洲大尺度在线观看| 天堂аⅴ在线地址8| 九九热免费在线视频| 国产精品jizz在线观看美国| jizzjizz韩国| jazzjazz国产精品麻豆| 欧美国产亚洲另类动漫| 中文字幕亚洲一区二区三区| 在线成人免费视频| 色吊丝中文字幕| 男人草女人视频| 国产精品视频免费播放| 欧美激情a∨在线视频播放| 九色|91porny| 国产精品欧美激情在线观看| 欧美日韩在线精品一区二区三区激情| 男人久久天堂| 在线观看a级片| 国产精品一区二区x88av| 色国产精品一区在线观看| 久久精品视频一| 激情久久久久| japonensisjava老师可播放| 在线免费观看电影网站入口| 欧美日韩精品一区二区三区四区| 中文字幕精品无码亚| 精品久久久久久久久久久久久久久久| 老司机一区二区| 香蒸焦蕉伊在线| 亚洲视频大全| 被男同事摸的水好多| a级毛片免费观看在线| 国产精品综合在线视频| 国产成人禁片在线观看| 亚洲人成啪啪网站| 欧美二区三区的天堂| 男人操女人免费网站| 亚洲精品第一区二区三区| 成人精品一区| 在线三级电影| 四虎精品永久在线| 成人高潮成人免费观看| 日本不卡一区二区三区| 电影天堂爱爱爱爱| 亚洲在线成人| 91久久在线| 久久久久99| 伊人国产在线视频| 欧美夫妻性生活| 少妇高清精品毛片在线视频| 久久精品国产第一区二区三区最新章节| 成人免费淫片视频软件| 色av手机在线| 国产精品丝袜久久久久久app| 国产精品看片资源| 精品久久久久久一区二区里番| 久本草在线中文字幕亚洲| 亚洲欧洲在线观看| caoporn国产精品| 人人爱人人干婷婷丁香亚洲| 中文字幕中文在线不卡住| 高清无码视频直接看| 超碰97免费观看| 欧美人体大胆444www| 国产精品人成电影| av小次郎在线| 欧美黑人一级片| 欧美一级片在线播放| 亚洲一| 免费黄色小视频| 国产精品高清一区二区| 亚洲另类在线观看| 色综合视频一区二区三区日韩| 精品国产免费人成网站| 四虎在线免费视频| 北岛玲一区二区三区四区| 伊人国产精品| 婷婷亚洲图片| 女人天堂亚洲aⅴ在线观看| 538国产视频| 国产精品视频26uuu| 精品人妻少妇AV无码专区| 中文字幕在线不卡一区二区三区| 国产精品天堂蜜av在线播放| 特黄特色欧美大片| 欧美日韩一区二区三区视频播放| 社区色欧美激情 | 91福利区在线观看| 97香蕉超级碰碰久久免费软件| 国产精品videossex撒尿| 国产一级网站视频在线| 最新国产精品精品视频| 亚洲字幕成人中文在线观看| 97视频在线观看网址| 九一国产在线| 麻豆久久久av免费| 日本乱码高清不卡字幕| caoporn97免费视频公开| 九色自拍麻豆| 久久一区二区三区欧美亚洲| 日韩久久一级片| 美女的诞生在线观看高清免费完整版中文| 91爱视频在线| 亚洲日本一区二区三区| 国产精品激情电影| 国产夜色精品一区二区av| 日韩精品一区二区三区蜜臀| 日夜干在线视频| 久久国产精品精品国产色婷婷| 亚洲经典一区| 日韩在线中文字幕视频| 日韩欧美在线播放| 国产欧美日韩精品a在线观看| 激情成人综合网| 夫妻性生活毛片| 国产精品伦理一区二区| 黄色免费福利视频| 亚洲欧美日韩成人高清在线一区| www.亚洲激情| 成人蜜臀av电影| 久久国产综合| 久久亚洲精品毛片| 国产精品久久久精品四季影院| 天天操天天摸天天舔| 色婷婷久久一区二区三区麻豆| 懂色av色香蕉一区二区蜜桃| 欧美日韩综合精品| 久久久国产精品一区二区中文| 亚洲精品视频在线| 天天伊人狠狠| 污污视频网站在线| 国产乱国产乱老熟| 精品无码av一区二区三区不卡| 精品国产免费一区二区三区四区| 性孕妇free特大另类| 欧美日本精品| 亚洲视频电影在线| 中文不卡1区2区3区| 含羞草激情视频| 18av在线视频| 日韩欧美在线视频日韩欧美在线视频| 国产精品白嫩美女在线观看| 又大又硬又爽免费视频| 91最新地址在线播放| 国产乱人乱偷精品视频a人人澡| 四虎影院在线域名免费观看| 牛牛影视精品影视| 爱爱免费视频网站| 在线这里只有精品| 精品欧美一区免费观看α√| 久久久www| 欧美另类videosbest视频| 亚洲国产美女久久久久| 国产在亚洲线视频观看| 国产不卡一卡2卡三卡4卡5卡在线| 91精品久久久久久久久不口人| 美女在线视频一区二区| 国产精品成人网| 日日摸夜夜爽人人添| 国产精品字幕| 日本黄视频在线观看|