31、 Object-C对象如何进行内存布局? |
1,所有父类的成员变量和自己的成员变量(实例变量、私有变量、以及声明为属性生成的变量)都会存放在该对象所对应的存储空间中。 |
2,每个对象内部都有一个 isa 指针,指向他的类对象,类对象中存放着本身对象的a,对象方法列表(对象能够接收的消息列表,保存在它所对应的类对象中)b,成员变量的列表。 c,属性列表。类对象内也有一个isa指针指向元对象(meta class),元对象内部存放的是类方法列表,类对象内部还有哦一个superclass的指针,指向他的父类对象 |
3,根对象就是NSObject,他的superclass指针指向nil |
4 , 类对象既然称为对象,那它也是一个实例,类对象中也有一个isa指针指向他的元类(meta class),即类对象是元类的实例,元类内部存放的是类方法列表,根元类的isa指针指向自己,superclass指针指向NSObject类。 |
总结:
|
32、Object-C 对象的isa的指针指向什么?有什么作用? |
isa 等价于 is kind of
|
33. Object-C中的类方法和实例方法区别和联系? |
类方法
|
34、Object-C 使用什么机制管理对象内存? |
1.Objective-C中所有对象都在堆区建立,由程序员负责释放对象所占用的内存。 内存管理机制由3种:垃圾回收、引用计数、C语言方式。 |
2.垃圾回收是Mac OS10.5提供的新方案,在系统存在一个垃圾收集器。 如果发现某个对象没有被任何对象使用,该对象被自动释放。 |
3.C语言方式,原始内存管理方式。 用户手动调用malloc、calloc函数分配内存,free回收内存。 |
4.引用计数机制:对象创建后,运行时系统通过对象维护的一个计数器来描述有多少个其他对象在使用自己,当计数器为0时,释放该对象占用的内存空间(该对象调用dealloc方法)。 |
5,内存管理规则:当使用alloc,new或copy创建一个对象时,对象的引用计数被设置为1.; 向对象发送retain消息,对象引用计数加1; 向对象发送release消息时,对象引用计数减1; 当对象引用计数为0时,运行时系统向对象发送dealloc消息并回收对象所占用的内存。 |
6.注意:如果类的实例变量时对象指针,则必须重载dealloc方法(例如圆circle类:有一个变量point是Point*类型); dealloc方法不能直接调用,只有对象的引用计数为0的时候,系统会自动向对象发送dealloc消息。 |
35、 使用block时什么情况会发生引用循环,如何解决? |
一个对象中强引用了block,在block中又强引用了该对象或该对象的成员变量,就会发生循环引用。 |
解决方法是将该对象使用__weak或者__block修饰符修饰之后再在block中使用或者将其中一方强制制空xxx = nil。 |
36、 Object-C在block内如何修改block外部变量? |
block 是为了支持并行编程,对于普通的 local 变量,我们就不能在 block 里边修改,因为 block 可以被多个线程并行运行,会有问题的,如果在 block 中修改普通变量,编译的时候也会报错。有两种方法: |
可以修改static全局变量;
|
37、IOS使用系统的某些block api,是否也考虑引用循环问题? |
一般不用考虑,因为官方文档中没有告诉我们要注意发生强引用,所以推测系统控件一般没有对这些block进行强引用,所以我们可以不用考虑循环强引用的问题 |
38、 Object-C中dispatch_barrier_async的作用 ? |
barrier:是障碍物的意思,在多个并行任务中间,他就像是一个隔离带,把前后的并行任务分开.
|
39、 addObserver:forKeyPath:options:context:各个参数的作用 ? |
// 添加键值观察 /** 1. 调用对象:要监听的对象 2. 参数 1> 观察者,负责处理监听事件的对象 2> 观察的属性 3> 观察的选项 4> 上下文 */ |
[self.person addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:@"Person Name"]; |
// NSObject 分类方法,意味着所有的 NSObject 都可以实现这个方法! // 跟协议的方法很像,分类方法又可以称为“隐式代理”!不提倡用,但是要知道概念! // 所有的 kvo 监听到事件,都会调用此方法 |
/** 1. 观察的属性 2. 观察的对象 3. change 属性变化字典(新/旧) 4. 上下文,与监听的时候传递的一致 可以利用上下文区分不同的监听! */ |
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { NSLog(@"睡会 %@", [NSThread currentThread]); [NSThread sleepForTimeInterval:1.0]; NSLog(@"%@ %@ %@ %@", keyPath, object, change, context); } |
40、 若类有实例变量NSString *_foo,调用setValue:forKey:时,可以以foo还是_foo作为key? |
都可以 |