zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    SQL Server 2008 导出数据与导入数据任务介绍
    如何绕过chrome的弹窗拦截机制
    jquery操作select(增加,删除,清空)
    JSON详解
    Intellij+Spring学习(一)
    Intellij IEDA 14.0+Tomcat Servlet开发
    04-Spring的注解开发
    03-Spring的XML配置
    02-Spring与IOC
    01-Spring概述
  • 原文地址:https://www.cnblogs.com/yxfBlogs/p/4965176.html
Copyright © 2011-2022 走看看