IOS开发工程师的近期面试题
1. 怎么修改只读(readonly)属性变量
使用KVC可以修改 kvc就是键值编码(key-value),可以通过指定的key获得想要的值value,而不是通过调用 Setter,Getter 方法访问
2.KVO 除了能观察属性外,能不能观察对象
不能观察对象
KVO,即 Key-Value Observing, 它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知。简单的说就是每次指定的被观察者的对象的属性被修改后,KVO就会自动通知相应的观察者了
KVO是一个对象能过观察另外一个对象的属性的值,并且能够发现值的变化。这是一个对象与另一个对象保持同步的一种方法,即当另一种对象的状态发生改变时,观察对象马上做出反应。它只能用来对属性做出反应,而不会用来对方法或者动作做出反应。
实现原理:当为某个对象属性注册监听的时候,该对象的 isa 指针就会指向一个中间类,而不是本来对象真实的类。所以说,对象的 isa 指针可以改变,我们的程序最好不要依赖 isa 指针。
简言而之就是:
1.当一个 object 有观察者时没动态创建这个 object 的类的子类
2.对于每一个被观察的 property, 重写其 set 方法
3.在重写的 set 方法中调用- willChangeValueForKey:和- didChangeValueForKey:通知观察者
4.当一个 property 没有观察者时,删除重写方法
5.当一个 boserver 观察任何一个 property 时,删除动态创建的子类
3.block里面能不能修改静态变量
能 __block 可以 ---> 为什么要用__block
你可以指定引入一个变量为可更改的,即读-写的,通过应用__block存储类型修改修饰符。
局部变量的__block的存储和register,auto,static等存储类型相似,但它们之间不兼容。
__block 变量保存在变量共享的作用域范围内,所有的 blocks 和 block 副本都声明或创建在和变量的作用于相同范围内。所以,如果任何 blocks 副本声明在栈内并未超出栈的结束时,该存储会让栈帧免于被破坏(比如封装为以后执行)。同一作用域范围内给定的多个 block 可以同时使用一个共享变量作为一种优化, block 存储在栈上面,就像blocks本身一样。如果使用 Block_copy 拷贝了 block 得一个副本(或者在 objective-C里面给 block 发送了一条 copy 消息),变量会被拷贝到堆上面。所以一个__ block 变量的地址可以随时间推移而更改。
使用 __block的变量有两个限制:
1.它们不能是可变长的数组
2.它们不能是包含有 C99可变疮毒的数组变量的数据结构
4. 声明一个block
声明 block
int (^myblock) (int)
说明:第一个 int 是 block 的返回值 myBlock 是 block 变量 第二个 int 是参数
在.h文件中 typedef void(^MyBlock)(int value); @property (nonatomic,weak) MyBlock block; -(void)setMyBlock:(void(^)(int value)) block;
在.m文件中 -(void)setMyBlock:(void(^)(int value)) block { if (block) { self.block=block; } }
5. 用coredata的时候,如果用户更新个人信息了,怎么用代码来更新页面上显示的个人信息
1.当用户更新了自己的用户信息,保存更新数据到数据库
2.当用户返回更新页面时先查询数据库中的内容,显示到页面上就可以了。
查询数据库代码:
//创建请求 NSFetchRequest *request = [[NSFetchRequest alloc] init]; // 创建实体描述 NSEntityDescription *entity = [NSEntityDescription entityForName:ENTITY_NAME inManagedObjectContext:content]; [request setEntity:entity]; [request setReturnsObjectsAsFaults:NO]; //设置谓词 NSPredicate *predicate = [NSPredicate predicateWithFormat: @"self = %@", data]; [request setPredicate:predicate]; //执行请求 NSArray *dataArray = [content executeFetchRequest:request error:nil]; //修改信息 if ([dataArray count] > 0) { TaskTypeEntity *taskTypeEntity = [dataArray objectAtIndex:0]; taskTypeEntity.color = data.color; taskTypeEntity.status = data.status; taskTypeEntity.image = data.image; taskTypeEntity.name = data.name; BOOL result = [content save:nil]; if (result) { NSLog(@“ "); }else{ NSLog(@" "); } }
保存数据成功之后,在个人信息显示页面重复上述步骤查询之后直接更新数据