知识点

知识点

二进制底层

https://www.bilibili.com/video/av80851434/
70m

0:底层概述(OC本质、KVC、KVO、Categroy、Block)

https://juejin.im/post/5d5bd09af265da039b249bef#heading-12

1:runloop 相关

https://juejin.im/post/5cb745dde51d456e6479b463

2:runtime 相关

https://juejin.im/post/5d9f3dbc6fb9a04e0926092d

3:多线程

https://juejin.im/post/5d9f3eb0e51d4577ec4eb977

架构

https://juejin.im/post/5d9f3f0af265da5b7a7544b2

网络相关

https://juejin.im/post/5d61fc046fb9a06aef08f545#heading-19

对象销毁

// 对象的内存销毁时间表

  1. 调用 -release :引用计数变为零
    • 对象正在被销毁,生命周期即将结束.
    • 不能再有新的 __weak 弱引用, 否则将指向 nil.
    • 调用 [self dealloc]
  2. 子类 调用 -dealloc
    • 继承关系中最底层的子类 在调用 -dealloc
    • 如果是 MRC 代码 则会手动释放实例变量们(iVars)
    • 继承关系中每一层的父类 都在调用 -dealloc
  3. NSObject 调 -dealloc
    • 只做一件事:调用 Objective-C runtime 中的 object_dispose() 方法
  4. 调用 object_dispose()
    • 为 C++ 的实例变量们(iVars)调用 destructors
    • 为 ARC 状态下的 实例变量们(iVars) 调用 -release
    • 解除所有使用 runtime Associate方法关联的对象
    • 解除所有 __weak 引用
    • 调用 free()

那么为什么明明调用了 super 这个关键字 返回的[super class] 还是 Student 呢 ?
通过上边代码可知 , [super class] 最终编译器转化成了 objc_msgSendSuper(struct objc_super *,SEL) ,其中
/// Specifies the superclass of an instance.
struct objc_super {
/// Specifies an instance of a class.
__unsafe_unretained _Nonnull id receiver;

/// Specifies the particular superclass of the instance to message. 

if !defined(__cplusplus) && !OBJC2

/* For compatibility with old objc-runtime.h header */
__unsafe_unretained _Nonnull Class class;

else

__unsafe_unretained _Nonnull Class super_class;

endif

/* super_class is the first class to search */

};

endif

复制代码objc_super 是一个结构体,内部有一个 receiver 实例,和一 个 Class super_class,指向了当前类的父类 Class ,通过这个父类可以直接的从父类里边开始查找方法,由于消息接收者还是当前类的实例对象 self, 最终如果在父类中没有找到class 这个方法,会在 Person 类的父类 NSObject 中去查找 class 方法,由于 NSObject 的 class 方法,调用的是 object_getClass(self) ,所以最终消息接收者为 student 实例对象,所以返回的还是 Student .
``
/// Specifies the superclass of an instance.
struct objc_super {
/// Specifies an instance of a class.
__unsafe_unretained _Nonnull id receiver;

/// Specifies the particular superclass of the instance to message. 

if !defined(__cplusplus) && !OBJC2

/* For compatibility with old objc-runtime.h header */
__unsafe_unretained _Nonnull Class class;

else

__unsafe_unretained _Nonnull Class super_class;

endif

/* super_class is the first class to search */

};

endif

作者:大兵布莱恩特0409
链接:https://juejin.im/post/5b46e5b1f265da0f6b76ee91
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
``

性能相关

1:异步绘制

https://www.jianshu.com/p/6634dbdf2964

https://www.jianshu.com/p/e2c5b2bab063

1.1 渲染上屏

https://cloud.tencent.com/developer/article/1071034
iOS 上视图或者动画渲染的各个阶段:
在 APP 内部的有4个阶段:
布局:在这个阶段,程序设置 View / Layer 的层级信息,设置 layer 的属性,如 frame,background color 等等。
创建 backing image:在这个阶段程序会创建 layer 的 backing image,无论是通过 setContents 将一个 image 传給 layer,还是通过 [drawRect:] 或 [drawLayer: inContext:] 来画出来的。所以 [drawRect:] 等函数是在这个阶段被调用的。
准备:在这个阶段,Core Animation 框架准备要渲染的 layer 的各种属性数据,以及要做的动画的参数,准备传递給 render server。同时在这个阶段也会解压要渲染的 image。(除了用 imageNamed:方法从 bundle 加载的 image 会立刻解压之外,其他的比如直接从硬盘读入,或者从网络上下载的 image 不会立刻解压,只有在真正要渲染的时候才会解压)。
提交:在这个阶段,Core Animation 打包 layer 的信息以及需要做的动画的参数,通过 IPC(inter-Process Communication)传递給 render server。

2: 大图处理

https://www.jianshu.com/p/fa48e8d5f9e4
首先排除CoreGraphics和Image I/O,UIKit解压后占内存比CoreImage小,但是解压过程中比CoreImage占内存大

image.png

//这里在cell 上加载图片的耗时操作没写

/*分析卡顿的原因:

所有的Cell的加载都在主线程的一次Runloop循环中,UI渲染也属于Runloop的事情,但是一次渲染18张图片,渲染太多。导致卡顿

解决思路:一次Runloop循环,只加载一张图片

步骤:

 1.观察(observer)Runloop的循环

 2.一次Runloop循环,加载一张图片

  |-Cell加载图片的方法放到数组里

  |-Runloop循环 一次,就从数组取出一个图片加载

*/

- (void)viewDidLoad {

    [self addRunloopObserver];

    self.tasks = NSMutableArray.array;

    [self addTask:^{

       

    }];

}

- (void)addTask:(RunloopBlock)task{

    //保存任务到数组

    [self.tasks addObject:task];

    if (self.tasks.count == 0) {

        return;

    }

    if (self.tasks.count>18) {

        [self.tasks removeObjectAtIndex:0];

    }

}

- (void)addRunloopObserver{

    //获取当前的runloop

    CFRunLoopRef runloop = CFRunLoopGetCurrent();

    //定义上下文

    /*

     typedef struct {

     CFIndex    version;

     void *    info;

     const void *(*retain)(const void *info);

     void    (*release)(const void *info);

     CFStringRef    (*copyDescription)(const void *info);

     } CFRunLoopObserverContext;

     */

    

    CFRunLoopObserverContext context = {

        0,

        (__bridge void *)self,

        &CFRetain,

        &CFRelease,

        NULL

    };

    

    //创建观察者

    //c 中create new copy 堆区开辟内存空间。需要释放

    CFRunLoopObserverRef  runLoopObserver = CFRunLoopObserverCreate(NULL, kCFRunLoopBeforeWaiting, YES, 0, &callback, &context);

    CFRunLoopAddObserver(runloop, runLoopObserver, kCFRunLoopCommonModes);

    //释放

    CFRelease(runloop);

}



void callback(CFRunLoopObserverRef observer, CFRunLoopActivity activity, void *info){

    ViewController *vc =  (__bridge ViewController *)info;

    if (vc.tasks.count == 0) {

        return;

    }

    RunloopBlock task = vc.tasks.firstObject;

    task();

    [vc.tasks removeObjectAtIndex:0];

};

3:H5的优化处理

https://cloud.tencent.com/developer/article/1137813

4:启动优化

https://cloud.tencent.com/developer/article/1071732

稳定性相关

1:内存OOM

https://cloud.tencent.com/developer/article/1071837

2:webview白屏

iOS 9以后 WKNavigtionDelegate 新增了一个回调函数:

  • (void)webViewWebContentProcessDidTerminate:(WKWebView *)webView API_AVAILABLE(macosx(10.11), ios(9.0));
    当 WKWebView 总体内存占用过大,页面即将白屏的时候,系统会调用上面的回调函数,我们在该函数里执行[webView reload](这个时候 webView.URL 取值尚不为 nil)解决白屏问题。在一些高内存消耗的页面可能会频繁刷新当前页面,H5侧也要做相应的适配操作。
    并不是所有H5页面白屏的时候都会调用上面的回调函数,比如,最近遇到在一个高内存消耗的H5页面上 present 系统相机,拍照完毕后返回原来页面的时候出现白屏现象(拍照过程消耗了大量内存,导致内存紧张,WebContent Process 被系统挂起),但上面的回调函数并没有被调用。在WKWebView白屏的时候,另一种现象是 webView.titile 会被置空, 因此,可以在 viewWillAppear 的时候检测 webView.title 是否为空来 reload 页面。
    综合以上两种方法可以解决绝大多数的白屏问题。

系统架构相关

1:秒杀系统的设计

https://segmentfault.com/a/1190000020970562

2:weex架构

https://cloud.tencent.com/developer/article/1071837

面试相关

https://juejin.im/post/5d9f3f4d518825358b221435#heading-53

知识点汇总

https://www.yuque.com/alexiiio/ldnotes/abbvb8

多线程考察

https://juejin.im/post/5d89796a6fb9a06af13da988#heading-13

https://github.com/iteatimeteam/Friday-QA/issues/2

启动治理

https://tech.meituan.com/2018/12/06/waimai-ios-optimizing-startup.html

直播相关

https://cloud.tencent.com/developer/article/1071631

openGL

https://cloud.tencent.com/developer/article/1427622

数据结构

https://juejin.im/post/5c9adba6f265da60fb3bfe60

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

推荐阅读更多精彩内容

  • 1: 获取控件宽高 控件View有getHeight()和getwidth()方法可以获取宽高,但是如果直接在on...
    自由人是工程师阅读 1,775评论 0 0
  • 16:标准的伸缩式toolbar布局 17:仿探探滑动效果,修改将喜欢和不喜欢按钮放入卡片内即可。 https:/...
    名字_都被占了阅读 515评论 0 0
  • 设计模式是什么? 你知道哪些设计模式,并简要叙述? 设计模式是一种编码经验,就是用比较成熟的逻辑去处理某一种类型的...
    iOS菜鸟大大阅读 705评论 0 1
  • 套路 举例 将不会的变成会的 侃侃而谈 HTML面试 (必考)你是如何理解HTML语义化的?举例:段落用p,边栏用...
    si_月阅读 220评论 0 0
  • 周五下午我在神路街用优步打车回住处。系统预约好车辆,导航显示司机四分钟后能到,我就站在路旁的店面影子下等着。 四分...
    枕藏写影视阅读 166评论 0 0