iOS面试题iOS面试相关iOS开发笔记

iOS底层面试题---OC语法部分

2018-11-16  本文已影响7人  ptlCoder
面试题的答案都是抛砖引玉,具体细节还得深入了解iOS底层原理

1、一个NSObject对象占用多少内存?

2、对象的isa指针指向哪里?

3、OC的类信息存放在哪里?

4、iOS用什么方式实现对一个对象的KVO?(KVO的本质是什么?)

5、如何手动触发KVO?

6、直接修改成员变量或属性会触发KVO么?

7、KVC的赋值和取值过程是怎样的?原理是什么?

7.1、KVC赋值

// 1.1 创建人
PTLPerson *p = [[PTLPerson alloc] init];
self.person = p;
// 1.2 创建狗
PTLDog *dog = [[PTLDog alloc] init];
// 1.3 将狗赋值给人
[p setValue:dog forKeyPath:@"dog"];
// 1.4 通过KVC给dog的weight属性赋值 
赋值时会自动找到人拥有的dog的weight属性
[p setValue:@10.0 forKeyPath:@"dog.weight"];
NSLog(@"books = %@", [p valueForKeyPath:@"dog.weight"]);
[dog print];

7.2、 KVC取值

NSMutableArray *tempM = [NSMutableArray array];
// 2.1 kvc取出出数组books中price的值
for (PTLBook *book in [p valueForKeyPath:@"books"]) {
    [tempM addObject:[book valueForKeyPath:@"price"]];
}
NSLog(@"%@", tempM);
// 2.2 kvc取出数组中price的最大值
NSLog(@"Max = %@", [[p valueForKeyPath:@"books"] valueForKeyPath:@"@max.price"]);

7.3、 原理

-(void)setName:(NSString *)newName 
{ 
[self willChangeValueForKey:@"name"]; //KVO在调用存取方法之前总调用 
[super setValue:newName forKey:@"name"]; //调用父类的存取方法 
[self didChangeValueForKey:@"name"]; //KVO在调用存取方法之后总调用 
} 

8、Category的实现原理?

9、Category和Class Extension的区别是什么?

10、Category中有load方法吗?load方法是什么时候调用的?load 方法能继承吗?

11、+load、+initialize方法的区别什么?它们在category中的调用的顺序?以及出现继承时他们之间的调用过程?

+load
+initialize

12、Category能否添加成员变量?如果可以,如何给Category添加成员变量?

13、block的原理是怎样的?本质是什么?

14、__block的作用是什么?

15、block的属性修饰词为什么是copy?使用block有哪些使用注意?

16、block在修改NSMutableArray,需不需要添加__block?

17、说说isa指针?

18、isa、superclass总结

image
上一篇下一篇

猜你喜欢

热点阅读