Vickate_iOS Checklist

[※]@property中有哪些属性关键字?

原子属性

atomic 和 nonatomic用来决定编译器生成的getter和setter是否为原子操作,atomic 设置成员变量的@property属性时 默认为是atomic 提供线程安全。

nonatomic 非原子性访问对于属性赋值的时候不加锁,多线程并发访问会提高性能,如果不加此属性则默认是两个访问方法都为原子型事务访问。

读写属性

readonly 此标记说明属性是只读的

readwrite 此标记说明属性会被当成读写的 这也是默认的属性

内存管理语义

assign、strong、 weak、unsafe_unretained、copy

ARC 默认属性

atomic、readwrite、strong(对象)/assign(基本数据)

[※]weak属性需要在dealloc中置nil么?

不需要。
在ARC环境无论是强指针还是弱指针都无需在 dealloc 设置为 nil , ARC 会自动帮我们处理
即便是编译器不帮我们做这些,weak也不需要在 dealloc 中置nil:

[※※※]@synthesize合成实例变量的规则是什么?假如property名为foo,存在一个名为_foo的实例变量,那么还会自动合成新变量么?

  • 如果指定了成员变量的名称,会生成一个指定的名称的成员变量,
  • 如果这个成员已经存在了就不再生成了.
  • 如果是 @synthesize foo;
    还会生成一个名称为foo的成员变量,也就是说:
    如果没有指定成员变量的名称会自动生成一个属性同名的成员变量,
  • 如果是 @synthesize foo = _foo;
    就不会生成成员变量了.

[※※※※※]在有了自动合成属性实例变量之后,@synthesize还有哪些使用场景?

  • 同时重写了setter和getter函数
  • 重写了只读属性property的getter(这里property必须声明在.m文件中)
  • 想要自定义实例变量的变量名
  • 声明在@protocol中的property
  • 重载的属性

备注:
重载属性时最好使用@dynamic,虽然@synthesize也可以用

[※※]objc中向一个nil对象发送消息将会发生什么?

objc是动态语言,每个方法在运行时会被动态转为消息发送,即:objc_msgSend(receiver, selector)。

objc在向一个对象发送消息时,
1.runtime库会根据对象的isa指针找到该对象实际所属的类,
2.然后在该类中的方法列表以及其父类方法列表中寻找方法运行,
3.然后在发送消息的时候,objc_msgSend方法不会返回值,所谓的返回内容都是具体调用时执行的。那么,回到本题,如果向一个nil对象发送消息,首先在寻找对象的isa指针时就是0地址返回了,所以不会出现任何错误。

如果给一个已经释放的对象发送消息,会崩溃。

objc中向一个对象发送消息[obj foo]和objc_msgSend()函数之间有什么关系?

[obj foo];在objc动态编译时,会被转意为:objc_msgSend(obj, @selector(foo));

[※※※]什么时候会报unrecognized selector的异常?

objc在向一个对象发送消息时,runtime库会根据对象的isa指针找到该对象实际所属的类,然后在该类中的方法列表以及其父类方法列表中寻找方法运行,如果,在最顶层的父类中依然找不到相应的方法时,程序在运行时会挂掉并抛出异常unrecognized selector sent to XXX 。

objc的运行时会给出三次拯救程序崩溃的机会
Method resolution、Fast forwarding、Normal forwarding

[※※※※]一个objc对象的isa的指针指向什么?有什么作用?

https://blog.csdn.net/kesalin/article/details/7211228

[※※※※]下面的代码输出什么?

@implementation Son : Father
- (id)init
{
    self = [super init];
    if (self) {
        NSLog(@"%@", NSStringFromClass([self class]));
        NSLog(@"%@", NSStringFromClass([super class]));
    }
    return self;
}
@end

简单来说,self和super都是指向当前实例的,不同的是,[self class]会在当前类的方法列表中去找class这个方法,[super class]会直接开始在当前类的父类中去找calss这个方法,两者在找不到的时候,都会继续向祖先类查询class方法,最终到NSObject类。那么问题来了,由于我们在Father和Son中都没有去重写class这个方法,最终自然都会去执行NSObject中的class方法,结果也自然应该是一样的。至于为什么是Son,我们可以看看NSObject中class的实现:

-(Class)class { 
    return object_getClass(self); 
}

这就说的通了,返回的都是self的类型,self此处正好就是Son,因此结果就会输出Son。

[※※※※]runtime如何通过selector找到对应的IMP地址?(分别考虑类方法和实例方法)

在寻找IMP的地址时,runtime提供了两种方法

IMP class_getMethodImplementation(Class cls, SEL name); // 效率更高
IMP method_getImplementation(Method m)

1、IMP class_getMethodImplementation(Class cls, SEL name); // 效率更高

类方法(假设有一个类A)
class_getMethodImplementation(objc_getMetaClass("A"),@selector(methodName));

实例方法
class_getMethodImplementation([A class],@selector(methodName));

2、IMP method_getImplementation(Method m)

类方法
Method class_getClassMethod(Class cls, SEL name)

实例方法
Method class_getInstanceMethod(Class cls, SEL name)

[※※※※]使用runtime Associate方法关联的对象,需要在主对象dealloc的时候释放么?

- (void)setAddProperty:(id)addProperty {
    objc_setAssociatedObject(self, @selector(addProperty), addProperty, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

- (id)addProperty {
    return objc_getAssociatedObject(self, @selector(addProperty));
}

- (void)dealloc {
    [self setAddProperty:nil];
}

不需要,dealloc的时候会调用object_dispose,这儿会处理关联对象,weak对象

[※※※※※]:objc中的类方法和实例方法有什么本质区别和联系?

实例方法中可以使用类方法,用类名去调用

比如有一个类 example

里面定义 了两个方法  
+(void)fun1; //类方法
-(void)fun2; //实例方法

用法:
[example fun1];
example *tmp = [[example alloc]init];
[tmp fun2];

问题[※※※※※]:_objc_msgForward函数是做什么的,直接调用它将会发生什么?

直接调用_objc_msgForward是非常危险的事,如果用不好会直接导致程序Crash,但是如果用得好,能做很多非常酷的事。

一旦调用_objc_msgForward,将跳过查找 IMP 的过程,直接触发“消息转发”,如果调用了_objc_msgForward,即使这个对象确实已经实现了这个方法,你也会告诉objc_msgSend:“我没有在这个对象里找到这个方法的实现”

runtime如何实现weak变量的自动置nil?

runtime 对注册的类, 会进行布局,对于 weak 对象会放入一个 hash 表中。 用 weak 指向的对象内存地址作为 key,当此对象的引用计数为0的时候会 dealloc, 在这个 weak 表中搜索,找到所有以a为键的 weak 对象,从而设置为 nil。

weak 修饰的指针默认值是 nil (在Objective-C中向nil发送消息是安全的)

[※※※※※]:能否向编译后得到的类中增加实例变量?能否向运行时创建的类中添加实例变量?为什么?

不能向编译后得到的类中增加实例变量;
能向运行时创建的类中添加实例变量;

原因如下:

因为编译后的类已经注册在 runtime 中,类结构体中的 objc_ivar_list 实例变量的链表 和 instance_size 实例变量的内存大小已经确定,同时runtime 会调用 class_setIvarLayout 或 class_setWeakIvarLayout 来处理 strong weak 引用。所以不能向存在的类中添加实例变量;

运行时创建的类是可以添加实例变量,调用 class_addIvar 函数。但是得在调用 objc_allocateClassPair 之后,objc_registerClassPair 之前,原因同上。

Runloop和线程的关系

runloop与线程是一一对应的,一个runloop对应一个核心的线程,为什么说是核心的,是因为runloop是可以嵌套的,但是核心的只能有一个,他们的关系保存在一个全局的字典里。
runloop是来管理线程的,当线程的runloop被开启后,线程会在执行完任务后进入休眠状态,有了任务就会被唤醒去执行任务。
runloop在第一次获取时被创建,在线程结束时被销毁。
对于主线程来说,runloop在程序一启动就默认创建好了。
对于子线程来说,runloop是懒加载的,只有当我们使用的时候才会创建,所以在子线程用定时器要注意:确保子线程的runloop被创建,不然定时器不会回调。

//猜想runloop内部是如何实现的?
1、有一个判断循环的条件,满足条件,就一直循环
2、线程得到唤醒事件被唤醒,事件处理完毕以后,回到睡眠状态,等待下次唤醒

[※※※※※]苹果是如何实现autoreleasepool的?

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

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

推荐阅读更多精彩内容