iOS学习笔记

1.在OC中向一个nil对象发送消息会发生什么?
在Objective-C中向nil对象发送消息不会报错,只是在运行不会有任何作用。objc在向一个对象发送消息的时候,runtime是根据对象isa指针找到该对象所属的类,然后在该类和它的父类的方法列表里找方法运行。如果向一个nil对象发送消息的话,在寻找对象的isa指针的时候就返回0地址,所以不会出现任何错误。所以发送给nil的消息返回0(nil);

2.如果@property后面关键字不写,默认是什么?
默认的关键字,OC对象:atomic readwrite strong
基本数据类型:atomic readwrite assign

3.UITableView实现了delegate中的heightForRowAtIndexPath:方法后,rowHeight这个属性的设置将无效。

4.runtime如何实现weak变量自动设置nil
runtime会有一个全局的hash表,用weak指向的对象的地址作为key存入,当对象的引用计数为0的时候,对象要释放的时候runtime就会以对象的地址为key查找到所有存有这个对象的weak属性设置为nil。

5.Block分三种(根据isa指针)
1 _NSConcreteStackBlock 分配在栈上,只用到外部的局部变量、成员属性变量,切没有强指针引用。生命周期由系统管理,一旦返回后就被系统销毁了。
2 _NSConcreteMallocBlock 有强指针引用或copy修饰的成员属性引用的Block会被复制一份到堆上成为MallocBlock,没有强指针引用即销毁(ARC机制),生命周期由程序员控制。
3 _NSConcreteGlobalBlock 没有用到外界变量或只用到全局变量、静态变量,生命周期从创建到应用程序结束为止。

_NSConcreteMallocBlock是持有对象的(Block会对对象进行retain操作)。
_NSConcreteStackBlock和_NSConcreteGlobalBlock不会持有对象。

由于_NSConcreteStackBlock所属的变量域一旦结束,那么该Block就会被销毁。在ARC环境下,编译器会自动的判断,把Block自动的从栈copy到堆上。

  • 手动调用copy
  • Block是函数的返回值
  • Block被强引用
  • 调用系统API传入参数中含有usingBlock的方法

以上4中情况,系统都会默认调用copy方法吧Block复制到堆上。
但是我们自己写的方法把Block作为参数的时候就需要我们手动copy一份到堆上。
copy是把Block从栈上拷到堆上,dispose函数是把堆上的函数在废弃的时候销毁。

ARC环境下,一旦Block赋值就触发copy。copy会让block持有捕捉到的变量(包括自动变量和__block修饰的变量)。
非ARC下,Block被copy时不会持有__block变量,会持有其他变量。

typedef void(^blk)(void);
@interface MyObject : NSObject{
    blk _blk;
}
@end
- (instancetype)init {
    if (self = [super init]) {
        __block id tmp = self;
        _blk = [^{
            NSLog(@"%@",tmp);
        } copy];
    }
    return self;
}

所以这段代码在非arc下不会造成循环引用。在arc会循环引用。

typedef void(^blk)(void);
@interface MyObject : NSObject{
    blk _blk;
}
@end
- (instancetype)init {
    if (self = [super init]) {
        __block id tmp = self;
        _blk = ^{
            NSLog(@"%@",tmp);
            tmp = nil;
        } ;
    }
    return self;
}

这段代码就能在arc下防止循环引用(必须调用blk一次),不过一般arc下都是用__weak来防止循环引用的。

  1. C语言有5种存储域说明符(存储类型)
  • typedef
  • extern
  • static 静态变量存储在数据区中
  • auto 默认,修饰局部变量,自动变量存储在栈中
  • register 存储在寄存器中而不是内存中,不能使用&一元运算符,因为不在内存中,定义了 register 它意味着变量尽可能存储在寄存器中,这还取决于硬件和实现的限制允不允许

7.TCP协议三次握手,握手过程中使用tcp的标志(flag)——SYN(synchronize)和ACK(acknowledgement)
发送端首先发送一个带SYN标志的数据包给对方。接收端收到后,回传一个带有SYN/ACK标志的数据包以示传达确认信息。最后,发送端再传回一个带ACK标志的数据包,代表"握手"结束。

8.将写操作放入栅栏快单独执行,读操作并发执行

_syncQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

//读取字符串
- (NSString*)someString {
     __block NSString *localSomeString;
     dispatch_sync(_syncQueue, ^{
        localSomeString = _someString;
    });
     return localSomeString;
}
//设置字符串
- (void)setSomeString:(NSString*)someString {
     dispatch_barrier_async(_syncQueue, ^{
        _someString = someString;
    });
}

9.iOS中的静态库和动态库
静态库和动态库是相对于编译期和运行期的。静态库在程序编译时会被链接到目标代码中,程序运行不再需要改静态库;而动态库在程序编译时不会链接到目标代码中,只是在程序运行时才被载入。
静态库在链接时,会被完整的复制到可执行文件中,每个APP都会拷贝一份静态库,浪费内存。
动态库只有一份,程序运行时动态地加载到内存中,系统指挥加载一次,多个程序公用一份,节省内存。

10.+load与+initialize方法
+load方法是在runtime组件加载的时候调用的,也就是在main方法之前调用。调用顺序是:父类->子类->分类,系统只会调用一次(可以自己手动调用多次),子类没实现的话不会调用父类的+load方法,分类和类的+load都会调用。
+initialize方法是在向对象发送第一条消息的时候调用的(懒加载),也就是可能永远不调用。调用顺序是:父类->子类,系统可能多次调用,子类没实现会调用父类的initialize方法(+initialize调用是发消息流程),分类的+initialize会覆盖类的+initialize方法。

11.nil、Nil、NULL和NSNull的区别
nil、Nil、NULL本质上是(void*)0,即空指针,即作用完全相同。
NULL是c语言中的空指针,多用于c对象的置空。
nil是OC中的空指针,用于oc对象的置空。
Nil也是OC中的空指针,多用于表示Class的空。
NSNull是oc对象(有内存地址),用于表示一个内容为空的OC对象。

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

推荐阅读更多精彩内容