iOS 面试题(十一)

1  请写出代码,用blocks来取代上例中的protocol,并比较两种方法的优势。实际应用部分?请写出代码,用blocks取代协议或回调方法
   委托和Block是iOS上实现回调的两种机制。BLock基本可以代替委托的功能,而且实现起来比较简洁,比较推荐能用Block的地方不要用委托
   
   TimerControl.h文件
   // 委托的协议定义
   @protocol UpdateAlertDelegate
   -(void)UpdateAlter:(NSString *)title;
   @end

    @interface TimerControl :NSObject
    // 委托变量定义
    @property (nonatomic,weak)id<UpdateAlertDelegate>delegate
     
    //  block
    typedef void (^UpdateAlterBlock)(NSString * title);
    @property (nonatomic,copy)UpdateAlertBlock  updateAlertBlock;
    -(void)startTheTimer;
 
    @end


     TimerControl.m文件
    -(void)timerProc{
        [self.delegate updateAlert:@“this is title”]; // 委托更新UI
        // block代替委托
        if(self.updateAlertBlock){
            self.updateAlertBlock(@“this is title”);
        }
    }  
   

  再来看看视图类,实现Block即可
  -(void)viewDidLoad
  {
      [super viewDidLoad];
      TimerControl *timer = [[TimerControl alloc] init];
      timer.delegate = self; // 设置委托代理
      
      // 实现block
      timer.updateAlertBlock = ^(NSString *title){
           UIAlertView *alert = [[UIAlertView alloc] initWithTitle:title message:@“时间到” delegate:nil  otherButtonTitles:@“确定”,nil];
           alert.alertViewStyle = UIAlertViewStyleDefault;
           [alter show];
           
      };
      [timer startTheTimer]; // 启动定时器
  }

//  被委托对象,实现协议声明的方法 由委托对象调用 
-(void)updateAlert:(NSString *title){
   UIAlertView *alert = [[UIAlertView alloc] initWithTitle:title message:”时间到” delegate:nil otherButtonTitles:@“确认”,nil];
   alert.alertViewStyle = UIAlertViewStyleDefault;
   [alert  show];
}

2  你做iphone开发时候,有哪些传值方式,C和C之间是如何传值的?
    block回调传值    代理传值   单例传值  消息发送机制  属性传值
    最简洁的block回调传值:
    在需要传值的页面自定义block,并将需要传出的数据作为block的参数
    在接收数据页面调用block即可
    
3  给定的一个字符串,判断字符串中是否还有png,有就删除它?
    1  判断字符串是否含有指定字符串,返回位置和长度
    NSRange range = [string rangeOfString:@“png”];
    然后用字符串的截取获取删除后的字符串
    [str substringWithRange:]
    2  用指定字符串分割字符串,返回数组 
       [str componentsSeparatedByString:@“png”];
       然后进行字符串拼接
       [str stringByAppendingString:数组元素];
4   对于语句NSString* testObject = [[NSData alloc] init];testObject 在编译时和运行时分别是什么类型的对象?
    编译时被当做NSString的实例来处理,运行时其指针指向的是[NSData class],运行时实例只能收到NSData的固有实例方法(或者自己写的类的方法)  
    

能理解你的疑问,但是你问的问题不太正确,不存在编译时的对象这个概念。

首先,声明 NSString *testObject 是告诉编译器,testObject是一个指向某个Objective-C对象的指针。因为不管指向的是什么类型的对象,一个指针所占的内存空间都是固定的,所以这里声明成任何类型的对象,最终生成的可执行代码都是没有区别的。这里限定了NSString只不过是告诉编译器,请把testObject当做一个NSString来检查,如果后面调用了非NSString的方法,会产生警告。

接着,你创建了一个NSData对象,然后把这个对象所在的内存地址保存在testObject里。那么运行时,testObject指向的内存空间就是一个NSData对象。你可以把testObject当做一个NSData对象来用。

    
5   OC中是所有对象间的交互是如何实现的?
    在对象交互中,一个扮演数据发送者,一个作为数据接收者;
    OC中提供了方法实现两者间的通讯;
     例如:消息发送机制  代理协议  block回调等

6   目标-动作机制  
    目标是动作消息的接收者
    动作是控件发送给目标的消息,或者从目标的角度来看,它是目标为了响应动作而实现的方法
    程序需要某些机制来进行事件和指令的翻译。这个机制就是目标-动作机制
7   for(int index = 0; index < largenumber; index ++)
     {
       NSString *tempStr = @”tempStr”;
       NSLog(tempStr);
       NSNumber *tempNumber = [NSNumber numberWithInt:2];
       NSLog(tempNumber);
      }
这段代码有什么问题.?会不会造成内存泄露(多线程)?在内存紧张的设备上做大循环时自动释放池是写在循环内好还是循环外好?为什么?
   占用大量内存,可能造成程序崩溃
   在多线程中,此循环一直进行,可能制造出得不到数据的野指针,程序崩溃
   自动释放池写在内部好 ,每一次循环结束都会释放内存空间,若写在外面加上内存紧张会造成崩溃

8  描述上拉加载、下拉刷新的实现机制?
    下拉刷新的原理 : 当scrollView向下发生偏移,发起网络请求,请求刷新数据
    上拉加载更多:scrollView一开始不存在偏移量,但是会设定contentSize的大小,所以contentSize.height永远会比contentOffSet.y高出一个手机屏幕的高度。当contentOffset.y+手机屏幕高度大于这个滚动视图的contentSize.height时,发起网络请求,请求加载更多数据


9   什么是沙盒(sandbox)?沙盒包含哪些文件,描述每个文件的使用场景。如何获取这些文件的路径?如何获取应用程序包中文件的路径
     iOS应用程序只能在为该程序创建的文件系统中读取文件,不可以访问其他地方,这个区域被称为沙盒
     沙盒里包含以下内容:
    Documents  苹果建议将程序中建立的或在程序中浏览到的文件数据保存在该目录下,iTunes备份和恢复时包括此目录
    Library  存储程序的默认设置和其他状态信息 其中Caches存放缓存文件 ,此目录不会在应用退出删除,iTunes不会备份此目录
    tmp  提供一个即时创建临时文件的地方
    系统提供了方法NSSearchPathForDirectoriesInDomains(NSDocumentDirectory ,NSUserDomainMask,YES);
                                                                                NSLibraryDirectory
    tmpPath = NSTemporaryDirectory();
   获取程序包中文件的路径方法:通过NSFileManager中的查找方法
   两种方法subPathsOfDirectoryAtPath:文件夹名 error:nil
               subpathsAtPath:文件夹名 (后面不带获取失败原因参数)


10  介绍一下XMPP?有什么优缺点吗?
      XMPP(可扩展消息处理现场协议)是基于可扩展标记语言XML的协议,它用于即时消息(IM)以及在线现场探测。   
      优点: 开放
      XMPP协议是自由 开放 公开的 并且易于了解。在客户端 服务器 组件 源码库等方面,都已经各自有多种实现
      证实可用
      第一个Jabber(现在XMPP)技术是Jeremie Miller在1998年开发的,现在已经相当稳定;数以百计的开发者为XMPP技术而努力。今日的互联网上有数以万计的XMPP服务器运作着,并有数以百万计的人们使用XMPP实时传讯软件
     可扩展
     XML命名空间的威力可使任何人在核心协议的基础上创建定制化的功能;为了维持通透性,常见的扩展由XMPP标准基金会
     多样性
     用XMPP协议来创造及部署实时应用程序及服务的公司及开源代码计划分布在各种领域;用XMPP技术开发软件,资源及支持的来源是多样
    缺点:
数据负载太重
    随着通常超过70%的XMPP协议的服务器的数据流量的存在近60%的重复转发。
没有二进制数据
   XMPP协议的方式被编码为一个单一的长的XML文件,无法提供修改二进制数据。

11  谈谈对性能优化的看法,如何做?
      最好的用户体验优先 
      比如说断网下的数据显示

猜你喜欢

转载自blog.csdn.net/a_ss_a/article/details/38477411
今日推荐