iOS - 學(xué)習(xí)筆記 - OC對(duì)象

// 實(shí)例對(duì)象
NSObject *object1 = [[NSObject alloc] init];
NSObject *object2 = [[NSObject alloc] init];

// 類(lèi)對(duì)象
Class objcetClass1 = [object1 class];
Class objcetClass2 = [object2 class];
Class objectClass3 = [NSObject class];
Class objectClass4 = object_getClass(object1);
Class objectClass5 = object_getClass(object2);

// 元類(lèi)對(duì)象
Class objectTetaClass1 = object_getClass([NSObject class]);
Class objectTetaClass2 = object_getClass(objcetClass1);
instance對(duì)象 實(shí)例對(duì)象
    通過(guò)類(lèi)alloc出來(lái)的對(duì)象,每次alloc都會(huì)產(chǎn)生新的instance對(duì)象,占據(jù)不同的內(nèi)存
    實(shí)例對(duì)象內(nèi)存中只存儲(chǔ)成員變量、isa指針
    isa指針地址就是instance對(duì)象的地址
class對(duì)象 類(lèi)對(duì)象
    一個(gè)類(lèi)的類(lèi)對(duì)象在內(nèi)存中只有一個(gè)
    objcetClass1、objcetClass2、objcetClass3、objcetClass4、objcetClass5指向的指針是同一個(gè)
    類(lèi)對(duì)象在內(nèi)存中存儲(chǔ)isa指針、superclass指針、屬性信息、對(duì)象方法信息、協(xié)議信息、類(lèi)的成員變量信息
meta-class對(duì)象 元類(lèi)對(duì)象
    元類(lèi)對(duì)象也是Class類(lèi)型
    isa、superclass、類(lèi)方法
    和類(lèi)對(duì)象內(nèi)存結(jié)構(gòu)是一樣的。
    class_isMetaClass 判斷是否是元類(lèi)
    object_getClass傳類(lèi)對(duì)象
  • NSObject對(duì)象占用多少內(nèi)存
NSObject *obj = [[NSObject alloc] init];

16字節(jié)
  • Objective-C代碼
Objective-C -> c\c++ -> 匯編語(yǔ)言(依賴硬件) -> 機(jī)器語(yǔ)言
Objective-C面向?qū)ο蠖际腔赾\c++實(shí)現(xiàn)的

Objective-C對(duì)象基于什么數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)?
    結(jié)構(gòu)體(容納不同類(lèi)型)
//
//  main.m
//  OC_Object
//
//  Created by houjianan on 2020/6/10.
//  Copyright ? 2020 houjianan. All rights reserved.
//

#import <Foundation/Foundation.h>

int main(int argc, char * argv[]) {
    @autoreleasepool {
        NSObject *obj = [[NSObject alloc] init];
    }
    return 0;
}
  • OC如何轉(zhuǎn)成c\c++
clang 
clang -rewrite-objc main.m -o main.cpp
    cpp:c plus plus

xcrun
xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m -o main-arm64.cpp
    -sdk iphoneos:指定是iphoneos
    clang -arch arm64:編譯器指定架構(gòu)
    -rewrite-objc main.m -o main-arm64.cpp:重寫(xiě)main.m文件輸出為 main-arm64.cpp
  • 查看main-arm64.cpp
// NSObject定義
@interfaction NSObject {
    Class isa;
}
@end 

// 底層實(shí)現(xiàn)
struct NSObect_IMPL {
    Class isa; // 指針 類(lèi)型是Class 指針在64位環(huán)境占8字節(jié) 在32位占4字節(jié)
}

    isa內(nèi)存地址賦值給obj isa的內(nèi)存地址就是這個(gè)結(jié)構(gòu)體的地址(就是第一個(gè)成員的地址)
  • 實(shí)例對(duì)象
獲得NSObject類(lèi)的實(shí)例對(duì)象的成員變量所占用的大小
NSLog(@"%zd", class_getInstanceSize([NSObject class]));
—> 8

NSLog(@"%zd", sizeof([[Person alloc] init]));
—> 8

獲取obj指針?biāo)赶騼?nèi)存的大小
#import <malloc/malloc.h>
NSObject *obj = [[NSObject alloc] init];
NSLog(@"%zd", malloc_size((__bridge const void *)obj));
—> 16
  • 源碼
size_t instanceSize(size_t extraBytes) {
    size_t size = alignedInstanceSize() + extraBytes;
    // CF requires all objects be at least 16 bytes.
    if (size < 16) size =16;
    return size;
}
  • Debug -> Debug Workfllow -> View Memory
    輸入內(nèi)存地址 查看內(nèi)存

  • Student對(duì)象 16字節(jié)

  • 前8字節(jié)放isa

  • 后8字節(jié)放_(tái)no和_age

@interface Student: NSObject 
{
    @public 
    int _no;
    int _age;
}
@end 

@implementation Student 

@end 

int main(int argc, onst char * argv[]) {
    @autoreleasepool {
        Student *s = [[Student alloc] init];
        s->_no = 4;
        s->_age = 5;

        stuct Student_IMPL *stuImpl = (__bridge struct Student_IMPL *)stu;
        NSLog(@"no is %d, age is %d", stuImpl->_no, stuImpl->_age);
    }
}
  • .cpp中
struct Student_IMPL {
    struct NSObject_IMPL NSObject_IVARS; 
    int _no;
    int _age;
}

struct NSObject_IMPL NSObject_IVARS;
    父類(lèi)結(jié)構(gòu)
    相當(dāng)于    Class isa; // 8字節(jié) alloc了16字節(jié) 使用8字節(jié)
int _no;
int _age;
    自己的成員變量
struct NSObect_IMPL {
    Class isa;
}
  • calloc
void* calloc(size_t num_items, size_t size) {
    void *retval;
    retval = malloc_zone_calloc(default_zone, num_items, size);
    if (retval == NULL) {
        errno = ENOMEM;
    }
    return retval;
}
  • tips
1、指針在64位環(huán)境占8字節(jié) 在32位占4字節(jié)
2、impl縮寫(xiě)implementation:實(shí)現(xiàn)
3、armv7 arm32 arm64等等架構(gòu)
4、沒(méi)有指定架構(gòu)導(dǎo)出來(lái)的cpp文件比指定架構(gòu)的大
5、oc對(duì)象在底層就是一個(gè)結(jié)構(gòu)體
6、具體占多少字節(jié) 跟平臺(tái)有關(guān)系
7、結(jié)構(gòu)體的內(nèi)存地址就是第一個(gè)成員的地址
8、(__bridge const void *) oc和c\c++橋接
9、https://opensource.app.com/tarballs 蘋(píng)果源碼地址
10、int _no 4字節(jié) double 8字節(jié)
11、大端、小端。iOS中是小端
12、結(jié)構(gòu)體內(nèi)存對(duì)齊(有利于CPU訪問(wèn))
13、gnu開(kāi)源組織
14、sizeof是運(yùn)算符,編譯期已經(jīng)確定。
15、class方法 返回的是類(lèi)對(duì)象([NSObject class])
16、object_getClass傳類(lèi)對(duì)象
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,505評(píng)論 6 533
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,556評(píng)論 3 418
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 176,463評(píng)論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 63,009評(píng)論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,778評(píng)論 6 410
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,218評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,281評(píng)論 3 441
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,436評(píng)論 0 288
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,969評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,795評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,993評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,537評(píng)論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,229評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,659評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 35,917評(píng)論 1 286
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,687評(píng)論 3 392
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,990評(píng)論 2 374