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(@" ");
     }

}

 

   保存数据成功之后,在个人信息显示页面重复上述步骤查询之后直接更新数据                          

page3image5880
posted @ 2015-11-14 22:06  YXFBlog  阅读(1220)  评论(0编辑  收藏  举报