iOS 面试题总结 (二)

  1.  假设有一个字符串aabcad,请写一段程序,去掉字符串中不相邻的重复字符串,即上述字符串处理之后的输出结果为:aabcd
  2. NSMutableArray *marry = [[NSMutableArray alloc]init];
  3.     for (int i = 0; i < str.length - 1; i++) {
  4.       unsigned char a = [str characterAtIndex:i];
  5.         for (int j = i + 1; j < str.length; j++) {

                unsigned char b = [str characterAtIndex:j];

                if (a == b) {

                    if (j == i + 1) {


                    }else{

       

                   [marry addObject:[NSString stringWithFormat:@"%d",j]];

                    }

                }

            }

            }

    for (int i = marry.count - 1; i > 0; i--) {

            

            NSInteger num = [[marry objectAtIndex:i]intValue];

            [str deleteCharactersInRange:NSMakeRange(num, 1)];

     

        }

    2  获取一台设备唯一标识的方法有哪些?

    在iOS系统中,获取设备唯一标识的方法有很多:
    一.UDID(Unique Device Identifier) 2013年5月1日

     访问UIDIDs的程序将不再被审核通过,所以UDID是绝对不能用了


    二.UUID(Universally Unique Identifier) 中文意思是通过唯一识别码 。苹果公司建议使用UUID为应用生成唯一标识字符串 。要考虑应用被删除再重装的情况。此时想到了keychain(钥匙串)其不会因为App被删除而丢失,用这个特点来保存设备的唯一标识


    三.MAC Address iOS7 以后的系统,机子的MAC Address都是一样的,没办法区分,弃用此方法


    四.OPEN UDID 如果把使用了OpenUDID方案的应用全部删除,再重新获取OpenUDID ,此时的OpenUDID跟从前的不一样了,这种方法不保险


    五.广告标示符(IDFA-identifierForIdentifier)iOS6 中提供的方法advertisingIdentifier 通过调用方法返回一个NSUUID实例,最后可以获得一个UUID,有系统存着 可以还原 (设置程序 -> 通用 -> 还原 -> 还原位置与隐私 ;设置程序-> 通用 -> 关于本机 -> 广告 -> 还原广告标示符) 需要重启设备)


    六.Vindor标示符 (IDFV-identifierForVendor) iOS6 增加的 跟advertisingIdentifier一样,该方法返回一个NSUUID ,可以获得一个UUID


    七.推送token+bundle_id apple push token保证设备唯一,但必须有网情况下才工作,该方法不依赖于设备本身,但依赖于apple push

    (详解  请看博客单篇介绍  iOS设备唯一标识获取策略  ios设备唯一标识获取策略

     ) 

    3  iOS类是否可以多继承?如果没有,那可以用其他方法实现吗?简述实现过程。

    其实我们在学习设计模式的时候知道,多继承的效率不高,而且采用组合的模式可以完全代替继承模式。那么,这种思路完全可以用在OC中实现多继承(或许OC抛弃多继承,就是强迫我们使用更高效的组合设计模式吧!)。下面用实际的代码来表示组合如何来代替多继承。

           现在ClassC需要继承ClassA中methodA、ClassB中methodB,具体的代码实现为:

    //定义ClassA以及其methodA

    @interface ClassA : NSObject {
    }

    -(void)methodA;

    @end
    //定义ClassB以及其methodB
    @interface ClassB : NSObject {
    }

    -(void)methodB;

    @end
    //定义ClassC以及其需要的methodA,methodB
    @interface ClassC : NSObject {
      ClassA *a;
      ClassB *b;
    }

    -(id)initWithA:(ClassA *)A b:(ClassB *)B;

    -(void)methodA;
    -(void)methodB;

    @end

    //注意在ClassC的实现

    @implementation  ClassC

    -(id)initWithA:(ClassA *)A b:(ClassB *)B{

           a=[[ClassA alloc] initWithClassA: A];//[A copy];

           b=[[ClassB alloc] initWithClassB: B];//[B copy];

    }

    -(void)methodA{

          [a methodA];

    }
    -(void)methodB{

          [b methodB];

    }

    上面是采用组合的方式实现了多继承的功能,解决了OC不能多继承的语法。那么还有其他的方式来实现多继承吗?

    虽然OC在语法上禁止类使用多继承,但是在协议的遵守上却允许使用多继承。所以可以用协议来实现多继承。但是协议只能提供接口,而没有提供实现方式,如果只是想多继承基类的接口,那么遵守多协议无疑是最好的方法,而既需要多继承接口,又要多继承其实现,那么协议是无能为力了。多协议遵守比较简单,具体的实现方式这里就不讲了!


    4  堆和栈的区别

    数据结构的栈和堆 实际上时两种数据结构:堆和栈

    堆和栈都是一种数据项按序列的数据结构

    栈是具有后进先出性质的数据结构,就是后存放的先取,先存放的后取

    堆是一种经过排序的树形数据结构,每个结点都有一个值。堆的存取是随意的

    内存分配中的栈和堆

    前面说数据结构的堆和栈是为了说现在堆区和栈区区分 

    内存中栈区处于相对较高的地址以地址的增长方向为上的话,栈地址是向下增长的

     栈中分配局部变量空间,堆区是向上增长用于分配程序员申请的内存空间

    1 申请方式和回收方式不同 

    栈是系统自动分配空间的 堆则是程序员需要自己申请的空间 。所以栈上的数据,系统自动释放,堆上的数据只要程序员不释放就一直存在,可能造成内存泄露。

    2 申请后系统的响应

    栈:只有栈的剩余空间大于申请空间,系统为程序提供内存,否则将报异常提示栈溢出

    堆 : 操作系统有一个记录空闲内存地址的链表,当系统收到程序内存申请,会遍历链表,寻找第一个空间大于所申请空间的堆,并在首地址处记录本次分配的大小,将多余的部分重新放入空闲链中

    3  申请效率的比较

    栈:由系统自动分配,速度较快,但程序员无法控制

    堆 : 是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便

    4  申请大小的限制

    栈 : 栈是向低地址扩展的数据结构, 是一块连续的内存的区域 ,能从栈获得空间较小

    堆 : 堆是向高地址扩展的数据结构,是不连续的内存区域,堆获取的空间比较灵活,也比较大

    5  堆和栈的存储内容

    栈: 在函数调用时,第一个进栈的是主函数中函数调用后的下一条指令的地址,然后是函数的各个参数(参数一般由右向左入栈),然后是函数中的局部变量(注意静态变量不入栈)

    堆 : 一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容程序员安排

    6  存取效率的比较

    char s1[] = @“aaaa”; // 在运行时刻赋值,放在栈中

    char *s2 = @“bbbb” ; // 在编译时确定,放在堆里

    但是,在以后的存取中,在栈上的数组比指针指向的字符转(例如堆)快

    5  iOS本地数据存储都有哪几种方式?

    <span style="font-size:18px;"><span style="word-wrap: normal; word-break: normal; line-height: 27px; font-size: 18px;">答:</span><span style="word-wrap: normal; word-break: normal; line-height: 27px; font-size: 18px;"><span style="word-wrap: normal; word-break: normal; line-height: 26px; font-family: Tahoma, Arial, Helvetica, sans-serif, simsun;">1.  <wbr>NSKeyedArchiver(加密形式)</wbr></span><span style="word-wrap: normal; word-break: normal; line-height: 26px; font-family: Tahoma, Arial, Helvetica, sans-serif, simsun;"> <wbr></wbr></span><span style="word-wrap: normal; word-break: normal; line-height: 26px; font-family: Tahoma, Arial, Helvetica, sans-serif, simsun;"> <wbr> <wbr> <wbr></wbr></wbr></wbr></span></span>
    </span>

           2.  NSUserDefaults
           3.  Write写入方式
           4.  SQLite3

    (详见单篇解释  数据保存几种方式总结  iOS 数据保存几种方式总结


    6  iOS动态类型和动态绑定、动态载入

     

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值