2018-04-27

1、weak的底层实现

Runtime维护了一个weak表,用于存储指向某个对象的所有weak指针。
weak表其实是一个hash(哈希)表,
Key是所指对象的地址,Value是weak指针的地址(这个地址的值是所指对象的地址)数组。

weak 的实现原理可以概括一下三步:
1、初始化时:
  runtime会调用objc_initWeak函数,初始化一个新的weak指针指向对象的地址。
2、添加引用时:
  objc_initWeak函数会调用 objc_storeWeak() 函数,
  objc_storeWeak() 的作用是更新指针指向,创建对应的弱引用表。
3、释放时:
  调用clearDeallocating函数。
  clearDeallocating函数首先根据对象地址获取所有weak指针地址的数组,
  然后遍历这个数组把其中的数据设为nil,
  最后把这个entry从weak表中删除,最后清理对象的记录。

http://www.cocoachina.com/ios/20170328/18962.html

2、autoreleasepool

Tagged Pointer
伪对象,小于10位数的数字,值直接存放在指针中,解决64位系统,内存占用问题
类函数方法返回对象为unretained return value,生命周期被延长,不一定会使用 autorelease

http://www.cocoachina.com/ios/20170303/18829.html

3、dispatch_onec synchronized nonatomic atomic

synchronized 递归互斥锁
dispatch_onec 原子性 信号量完成线程同步 参数要是静态全局参数
atomic 自旋锁 循环等待直到解锁 自旋锁效率高于互斥锁

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

4、copy mutableCopy

嗯.png
不可变对象 
    copy 浅拷贝 内存地址不变 结果对象不可变 只改变指针地址
    mutableCopy 深拷贝 内存地址变化 结果为可变
可变对象 
    copy mutableCopy 都为深拷贝 内存地址变化
容器类对象,copy mutableCopy 内部对象地址不变

copy修饰属性时 不管声明类型为什么 赋值后都变成不可变
自定义对象 实现copy 要重写 copyWithZone
[[NSMutableArray alloc] initWithArray:arr1 copyItems:YES] 元素深拷贝

http://www.cocoachina.com/ios/20170601/19402.html

5、hit-test 响应链

1、扩大UIButton的响应热区
  重载UIButton的-(BOOL)pointInside: withEvent:方法,让Point即使落在Button的Frame外围也返回YES
2、子view超出了父view的bounds响应事件
  重载父view的-(UIView *)hitTest: withEvent:方法,去掉点击必须在父view内的判断,
  然后子view就能成为 hit-test view,用于响应事件

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

6、多线程
http://www.360doc.com/content/15/0618/17/19663521_479024177.shtml
http://www.cocoachina.com/ios/20180313/22573.html

7、单项链表

1、判断环,找出节点
*********************************************************************
* 函数名称:linklist *IsLoop(linklist *head)
* 函数功能:判断链表是否含有环,并找出环的入口
* 参    数:head----链表的头结点
* 返 回 值:若有环,则返回链表中环的入口结点;否则返回NULL
* 说    明:程序参考定理:碰撞点p到连接点的距离=头指针到连接点的距离
*********************************************************************
extern linklist *IsLoop(linklist *head)
{
    linklist *p1=head, *p2=head;
    int IsLoopFlag=0;
    if (head==NULL)
    return NULL;
    while (p2->next!=NULL && p2->next->next!=NULL)
    {
        p1 = p1->next;
        p2 = p2->next->next;

       if (p1==p2)
        {
            IsLoopFlag = 1;
            break;
        }
    }
    if (!IsLoopFlag)
    return NULL;
    else
    {
    // p2指向头结点,p1在第一次相遇点。
    // 之后利用定理,当p1再次等于p2时,相遇点即为环的入口结点
    p2 = head;  
    while (p1!=p2)
    {
        p1 = p1->next;
        p2 = p2->next;
    }
    return p1;
    }
}

2、反转
迭代:
linkList reverse(linkList head) {
    linkList p,q,pr;
    p = head->next;
    q = NULL;
    head->next = NULL;
    while(p) {
        pr = p->next;
        p->next = q;
        q = p;
        p = pr;
    }
    head->next = q;
    return head;
}

Node * Node_reverse_v2(Node* node) {
    if (node == NULL) return NULL;
    if (node->next == NULL) return node;

    Node *first = node; //总是指向新链表的首部。
    Node *now = node->next;
    Node *next = now->next;
    first->next = NULL; //首节点变成尾节点,尾节点的下一个节点置空,防止环路。
    do {
        next = now->next;
        now->next = first;
        first = now;
        now = next;
    } while (next != NULL);
    return first;
}
递归:
Node * Node_reverse(Node *node) {
    if (node == NULL) return NULL;
    if (node->next == NULL) return node;
    Node * n = Node_reverse(node->next);
    if (n != NULL) {
        n->next = node;
        node->next = NULL;
    }
    return node;
}

8、Bounds Frame

frame 针对父视坐标系图计算
bounds 针对自身坐标系,改变bounds的x、y,影响子视图位置
scrollView 滚动和边距原理,都是改变bounds的,x、y
改变bounds的大小,参照点是center,frame随之改变

https://blog.csdn.net/chenyufeng1991/article/details/51764303

9、锁 性能

1、OSSpinLock 自旋锁,最快,消耗大量 CPU 资源
    不绝对安全,线程高低优先级,造成优先级反转
2、dispatch_semaphore pthread_mutex 性能好
3、synchronized 慢

http://www.cocoachina.com/ios/20160707/16957.html
https://blog.ibireme.com/2016/01/16/spinlock_is_unsafe_in_ios/

10、setValue和setObject的区别

1、 setObject:forkey:中value是不能够为nil的,不然会报错。
     setValue:forKey:中value能够为nil,但是当value为nil的时候,会自动调用removeObject:forKey方法
2、setValue:forKey:中key的参数只能够是NSString类型,而setObject:forKey:的可以是任何类型

https://blog.csdn.net/itianyi/article/details/8661997

11、NSArray NSMutableArray 线程安全

NSMutableArray本身是线程不安全的,NSArray安全
不使用atomic修饰属性
1 、atomic 的内存管理语义是原子性的,仅保证了属性的setter和getter方法是原子性的,是线程安全的,但是属性的其他方法,
  如数组添加/移除元素等并不是原子操作,所以不能保证属性是线程安全的。
2 、atomic虽然保证了getter、setter方法线程安全,但是付出的代价很大,执行效率要比nonatomic慢很多倍(有说法是慢10-20倍)
3、使用nonatomic修饰NSMutableArray对象就可以了,而使用锁、dispatch_queue来保证NSMutableArray对象的线程安全
  实现:GCD用同步并行队列读操作,barrier(按照插入队列顺序,执行完才执行后边)写操作

https://blog.csdn.net/kangguang/article/details/79194563

12、算法 两个升序数组找相同元素

- (NSArray *)sameFromTwoArray:(NSArray *)arr1 array2:(NSArray *)arr2 {
    NSMutableArray *resultArr = [NSMutableArray array];
    for (int i=0, j=0; i<arr1.count && j< arr2.count;) {
        if (arr1[i] == arr2[j]) {
            [resultArr addObject:arr1[i]];
            i++;
            j++
        } else if (arr1[i] > arr2[j]) {
            j++;
        } else {
            i++;
        }
    }
    return resultArr;
}

13、二分查找

int binarySearch(int arr[], int len, int key)
  {
      int left = 0;
      int right = len - 1;
      int mid;
  
      while (left <= right) {
          mid = (left + right) / 2;
         if (key < arr[mid]) {//key在左边
             right = mid - 1;
         } else if (arr[mid] < key) {//key在右边
             left = mid + 1;
         } else {
             return mid;
         }
     }
     return -1;
 }

https://www.cnblogs.com/bofengyu/p/6761389.html

14、_ _block _ _weak

1.__block不管是ARC还是MRC模式下都可以使用,可以修饰对象,还可以修饰基本数据类型。 
2.__weak只能在ARC模式下使用,也只能修饰对象(NSString),不能修饰基本数据类型(int)。 
3.__block对象可以在block中被重新赋值,__weak不可以。 
4.__block对象在ARC下可能会导致循环引用,非ARC下会避免循环引用,__weak只在ARC下使用,可以避免循环引用,
    __block避免循环引用需要在block内部把__block修饰的obj置为nil
5.__weak 本身是可以避免循环引用的问题的,但是其会导致外部对象释放了之后,
    block内部也访问不到这个对象的问题,可以通过在 block 内部声明一个__strong 的变量来指向 weakObj,
    使外部对象既能在 block 内部保持住,又能避免循环引用的问题

https://www.cnblogs.com/xu-antong/p/6503344.html
https://www.cnblogs.com/yajunLi/p/6203222.html?utm_source=itdadao&utm_medium=referral

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

推荐阅读更多精彩内容

  • ZFQ_dacf 2018-04-27· 字数 459· 阅读 57· 日记本 姓名:周富强 公司:厦门大科机械有...
    ZFQ_dacf阅读 105评论 0 0
  • 六项精进打卡 姓名:谢鲁斌 宁波市百雷仕电动工具有限公司 【日精进打卡第7天】 努力组 【知~学习】 《六项精进》...
    谢鲁斌阅读 146评论 0 0
  • 今天开阳虽然下雨,但是我一点都没有感觉到冷。每天清晨醒来就先按排好自己的全天计划,做起事情来就不会慌乱。 每个人到...
    祝绍英阅读 211评论 0 0
  • emma_804f阅读 590评论 2 2
  • 这是一个快节奏的时代,科技的日新月异,社会的飞速发展,工作,生活,容不得我们一丝一毫的怠慢。似乎只有加班加...
    彦彦归来兮阅读 1,089评论 3 0