Use Mach-O section as plist

背景

plist以其可讀性強(qiáng)的特點(diǎn)撕贞,被大家首選用作配置文件耙旦。但是plist 文件的讀取速度實(shí)在不給力,是否有可選方案找都?答案是有的唇辨!

使用Section 保存數(shù)據(jù)

我們的程序編譯后代碼在.text ,數(shù)據(jù)在.data段能耻,我們可以通過聲明一個字符串在data段的特定的section里(默認(rèn)字符串在 __cstring這個section中)赏枚。

char * str __attribute((used,section("__DATA,Test"))) = "Hello world";

在運(yùn)行的時候通過

///< 頭文件:getsect.h
extern uint8_t *getsectiondata(
    const struct mach_header_64 *mhp,
    const char *segname,
    const char *sectname,
    unsigned long *size);

來獲取某個二進(jìn)制文件中亡驰,指定segment指定section的內(nèi)容。這樣子就能從代碼中獲得配置信息饿幅。

Coding

#ifndef __LP64__
#define mach_header mach_header
#else
#define mach_header mach_header_64
#endif

//使用 used字段凡辱,即使沒有任何引用,在Release下也不會被優(yōu)化
#define WriteSection(sectName) __attribute((used, section("__DATA,"#sectName" ")))
#define SectionDataWithKeyValue(key,value) char * k##key WriteSection(CustomSection) = "{ \""#key"\" : \""#value"\"}";

// 注入 :
SectionDataWithKeyValue(url, www.baidu.com)


#import "ViewController.h"
#include <mach-o/getsect.h>
#include <mach-o/loader.h>
#include <mach-o/dyld.h>
#include <dlfcn.h>

static NSString *configuration = @"";
const struct mach_header *machHeader = NULL;

@interface ViewController ()
@end

@implementation ViewController

- (void)viewDidLoad {
    
    [super viewDidLoad];
    NSLog(@"%@",[self readConfigFromSectionName:@"CustomSection"]);
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (NSArray <NSDictionary *> *)readConfigFromSectionName:(NSString *)sectionName
{
    NSMutableArray *configs = [NSMutableArray array];
    if (sectionName.length)
    {
        if (machHeader == NULL)
        {
            Dl_info info;
            dladdr((__bridge const void *)(configuration), &info);
            machHeader = (struct mach_header*)info.dli_fbase;
        }
        unsigned long size = 0;
        uintptr_t *memory = (uintptr_t*)getsectiondata(machHeader, SEG_DATA, [sectionName UTF8String], & size);
        
        NSUInteger counter = size/sizeof(void*);
        NSError *converError = nil;
        for(int idx = 0; idx < counter; ++idx){
            char *string = (char*)memory[idx];
            
            NSString *str = [NSString stringWithUTF8String:string];
            NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
            id json = [NSJSONSerialization JSONObjectWithData:data options:0 error:&converError];
            if (json && [json isKindOfClass:[NSDictionary class]])
            {
                [configs addObject:json];
            }
        }
    }
    return configs;
}
@end

最終輸出:

2017-06-05 22:41:54.431 WriteSectionData[27360:1459771] (
        {
        url = "www.baidu.com";
    }
)
WriteSectionData.png

由于小端序的原因栗恩,所以在鏡像中的地址應(yīng)該是0x0100001a70透乾。 用hopper 打開程序,定位到地址:0x0100001a70磕秤。

WriteSectionData_hop.png

通過字符串定位到鏡像文件的指定section乳乌,讀取配置信息。并且實(shí)現(xiàn)了代碼編寫的時候注入市咆,無需文件IO(內(nèi)存讀惹张ぁ),代碼即配置床绪,局部性強(qiáng),可讀性高其弊。

TODO:性能對比

  • 對比數(shù)據(jù)從section 和plist 讀取數(shù)據(jù)轉(zhuǎn)化為json的耗時
  • 對比數(shù)據(jù)量一樣的前提下癞己,文件大小的對比。
  • section 段增大梭伐,是否會對啟動速度有影響痹雅。

更多

關(guān)于DATA 段大小的限制

App Size for iOS (& tvOS) only

Your app’s total uncompressed size must be less than 4GB. Each Mach-O executable file (for example, app_name.app/app_name) must not exceed these limits:

For apps whose MinimumOSVersion is less than 7.0: maximum of 80 MB for the total of all __TEXT sections in the binary.
For apps whose MinimumOSVersion is 7.x through 8.x: maximum of 60 MB per slice for the __TEXT section of each architecture slice in the binary.
For apps whose MinimumOSVersion is 9.0 or greater: maximum of 500 MB for the total of all __TEXT sections in the binary.
However, consider download times when determining your app’s size. Minimize the file’s size as much as possible, keeping in mind that there is a 100 MB limit for over-the-air downloads.

以上引用自蘋果官方文檔,官方只給出了TEXT段的大小限制糊识,并沒有給出DATA 段的大小限制绩社。
Ref :

Specifying Attributes of Variables

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市赂苗,隨后出現(xiàn)的幾起案子愉耙,更是在濱河造成了極大的恐慌,老刑警劉巖拌滋,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件朴沿,死亡現(xiàn)場離奇詭異,居然都是意外死亡败砂,警方通過查閱死者的電腦和手機(jī)赌渣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來昌犹,“玉大人坚芜,你說我怎么就攤上這事⌒崩眩” “怎么了鸿竖?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵沧竟,是天一觀的道長。 經(jīng)常有香客問我千贯,道長屯仗,這世上最難降的妖魔是什么脐彩? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任日矫,我火速辦了婚禮浦辨,結(jié)果婚禮上茵休,老公的妹妹穿的比我還像新娘垂谢。我一直安慰自己苇经,他們只是感情好理卑,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布大年。 她就那樣靜靜地躺著芜果,像睡著了一般鞠呈。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上右钾,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天蚁吝,我揣著相機(jī)與錄音,去河邊找鬼舀射。 笑死窘茁,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的脆烟。 我是一名探鬼主播山林,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼邢羔!你這毒婦竟也來了驼抹?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤拜鹤,失蹤者是張志新(化名)和其女友劉穎框冀,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體敏簿,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡左驾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了极谊。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诡右。...
    茶點(diǎn)故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖轻猖,靈堂內(nèi)的尸體忽然破棺而出帆吻,到底是詐尸還是另有隱情,我是刑警寧澤咙边,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布猜煮,位于F島的核電站次员,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏王带。R本人自食惡果不足惜淑蔚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望愕撰。 院中可真熱鬧刹衫,春花似錦、人聲如沸搞挣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽囱桨。三九已至仓犬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間舍肠,已是汗流浹背搀继。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留翠语,地道東北人律歼。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像啡专,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子制圈,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評論 2 345

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

  • 國家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 10,869評論 6 13
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理们童,服務(wù)發(fā)現(xiàn),斷路器鲸鹦,智...
    卡卡羅2017閱讀 134,599評論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,748評論 6 342
  • *面試心聲:其實(shí)這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,125評論 29 470
  • 人生有一千種一萬種可能的路走慧库,而我們選了一條幾乎所有人都看來不理解的艱難道路前進(jìn)。一切的選擇都是為了我們心里夢想的...
    蜀湘情緣閱讀 118評論 0 0