zoukankan      html  css  js  c++  java
  • iOS面试题 -总结 ,你的基础扎实吗?

    1、#import和#include的区别,@class代表什么?

      

    (1)#import指令是Object-C针对#include的改进版本,#import确保引用的文件只会被引用一次,这样你就不会陷入递归包含的问题中。

    (2)#import与@class二者的区别在于:

    #import会链入该头文件的全部信息,包括实体变量和方法等;而@class只是告诉编译器,其后面声明的名称是类的名称,至于这些类是如何定 义的,暂时不用考虑。在头文件中, 一般只需要知道被引用的类的名称就可以了。 不需要知道其内部的实体变量和方法,所以在头文件中一般使用@class来声明这个名称是类的名称。 而在实现类里面,因为会用到这个引用类的内部的实体变量和方法,所以需要使用#import来包含这个被引用类的头文件。

    在编译效率方面考虑,如果你有100个头文件都#import了同一个头文件,或者这些文件是依次引用的,如A–>B, B–>C, C–>D这样的引用关系。当最开始的那个头文件有变化的话,后面所有引用它的类都需要重新编译,如果你的类有很多的话,这将耗费大量的时间。而是用 @class则不会。

    如果有循环依赖关系,如:A–>B, B–>A这样的相互依赖关系,如果使用#import来相互包含,那么就会出现编译错误,如果使用@class在两个类的头文件中相互声明,则不会 有编译错误出现。所以,一般来说,@class是放在interface中的,只是为了在interface中引用这个类,把这个类作为一个类型来用的。 在实现这个接口的实现类中,如果需要引用这个类的实体变量或者方法之类的,还是需要import在@class中声明的类进来.

    2、浅拷贝和深拷贝区别是什么?

    浅拷贝

    浅拷贝就是对内存地址的复制,让目标对象指针和源对象指向同一片内存空间。如:

    1
    2
    char* str = (char*)malloc(100);
    char* str2 = str;

    浅拷贝只是对对象的简单拷贝,让几个对象共用一片内存,当内存销毁的时候,指向这片内存的几个指针需要重新定义才可以使用,要不然会成为野指针。

    iOS 里面的浅拷贝:

    在 iOS 里面, 使用retain 关键字进行引用计数,就是一种更加保险的浅拷贝。他既让几个指针共用同一片内存空间,又可以在release 由于计数的存在,不会轻易的销毁内存,达到更加简单使用的目的。

    深拷贝:

    深拷贝是指拷贝对象的具体内容,而内存地址是自主分配的,拷贝结束之后,两个对象虽然存的值是相同的,但是内存地址不一样,两个对象也互不影响,互不干涉。

    copy 与 retain 的区别:

    copy 是创建一个新对象,retain 是创建一个指针,引用对象计数加一。 copy属性标识两个对象内容相同,新的对象retain count为1, 与旧有对象引用计数无关,旧有对象没有变化。copy减少对象对上下文的依赖。

    iOS里的深拷贝:

    iOS提供了copy和mutableCopy方法,顾名思义,copy就是复制了一个imutable的对象,而mutableCopy就是复制了一个mutable的对象。以下将举几个例子来说明。
    这里指的是NSString, NSNumber等等一类的对象。

    1
    2
    3
    4
    NSString *string = @”dddd";
    NSString *stringCopy = [string copy];
    NSMutableString *stringDCopy = [string mutableCopy];
    [stringMCopy appendString:@"!!"];

    查看内存可以发现,string和stringCopy指向的是同一块内存区域(weak reference),引用计数没有发生改变。而stringMCopy则是我们所说的真正意义上的复制,系统为其分配了新内存,是两个独立的字符串内容是一样的。

    拷贝构造:

    当然在 ios 中并不是所有的对象都支持copy,mutableCopy,遵守NSCopying协议的类可以发送copy消息,遵守NSMutableCopying协议的类才可以发送mutableCopy消息。

    假 如发送了一个没有遵守上诉两协议而发送copy或者 mutableCopy,那么就会发生异常。但是默认的ios类并没有遵守这两个协议。如果想自定义 一下copy 那么就必须遵守NSCopying,并且实现 copyWithZone: 方法,如果想自定义一下mutableCopy 那么就必须遵 守NSMutableCopying,并且实现 mutableCopyWithZone: 方法。

    如果是我们定义的对象,那么我们自己要实现NSCopying , NSMutableCopying这样就能调用copy和mutablecopy了。举个例子:

    1
    2
    3
    4
    5
    6
    7
    8
    @interface MyObj : NSObject<NSCopying, NSMutableCopying>{
        NSMutableString *_name;
        NSString * _imutableStr ;
        int _age;
    }     
    @property (nonatomic, retain) NSMutableString *name;
    @property (nonatomic, retain) NSString *imutableStr;
    @property (nonatomic) int age;

    copy拷贝构造:

    1
    2
    3
    4
    5
    6
    7
    - (id)copyWithZone:(NSZone *)zone{
        MyObj *copy = [[[self class] allocWithZone :zone] init];
        copy->name = [_name copy];
        copy->imutableStr = [_imutableStr copy];
        copy->age = age;
        return copy;
    }

    mutableCopy拷贝构造:

    1
    2
    3
    4
    5
    6
    - (id)mutableCopyWithZone:(NSZone *)zone{
        MyObj *copy = NSCopyObject(self, 0, zone);
        copy->name = [_name mutableCopy];
        copy->age = age;
        return copy;
    }

    3、Objective-C中类别和类扩展的区别?

    4、Objective-C堆和栈的区别?

    5、内存管理的几个原则是什么?

    6、NSMuatableArray *array = [NSMuatableArray array] 需要释放么?

    7、@property本质是什么

    8、delegate用什么属性修饰,ARC下与MRC下有何不同,为什么?

    9、NSString,NSArray,NSMutableArray分别用什么属性修饰,原因是什么?

    10、block用什么属性修饰,为什么?

    11、__block与__weak的区别是什么?

    12、assign与weak的区别是什么?

    13、分别写一个setter方法

    完成@property(nonatomic,retain)NSString *name和@property(nonatomic,copy)NSString *name

    14、@autoreleasepool {for (long i = 0; i < largeNumber; i++) {Person *per = [[Person alloc] init];[per autorelease];}}有什么内存问题,如何改正?

    15、如何写一个单例?

    16、post与get的区别?

    17、Http与tcp,udp的区别?

    18、http都设置哪些header?

    19、http与https的区别?

    20、网络七层协议(http,tcp/ip处于哪一层)?

    21、常用多线程方式有哪些?

    22、NSOperation比GCD有哪些优点,如何处理线程依赖

    23、runloop与线程的关系

    24、runtime的理解

    25、在实际项目中遇到过死锁么?如何处理死锁问题

    26、runloop有几种模式,runloop接收几种输入源

    27、如何处理滑动UI过程中,广告轮播图停止轮询问题,使用runloop的哪种模式

    28、有一个需求,需要将N个请求全部完成之后执行某个操作,该如何处理

    29、weak会有性能开销么?使用什么代替

    30、autorelease pool的原理是什么

    31、runloop的原理

    32、runloop与autoreleasepool的关系

    33、block会延长对象的生命周期么?

    34、SSL加密流程

    35、网络加密方式有哪些,各自的原理

    36、AFnetworking原理

    37、SDWebImage框架原理以及是如何做图片缓存的

    38、冒泡排序/快速排序算法

    39、CALayer与UIView的区别是什么?

    40、iOS有几种动画,各自是什么?

    41、用熟悉的动画写一个移动的动画

    42、instancetype与id的区别

    43、如何进行代码适配

    44、xib如何处理动态view布局

    45、如何处理webview与js之间交互

    46、自己自定义一个轮播图

    47、如何进行热修复?

    48、对MVVM的理解以及如何实践

    49、如何进行自动化打包?

    50、如何对网络请求进行二次封装

    51、比如开发人员要打发布包与企业包,如何在不修改bundle id的情况下快速打包?

    52、block比delegate有哪些优缺点

    53、FMDB是线程安全的么?

    54、tableview从哪些方面进行流畅度优化?

     

  • 相关阅读:
    RESTful API 架构解读
    在阿里云 ECS 搭建 nginx https nodejs 环境(三、nodejs)
    在阿里云 ECS 搭建 nginx https nodejs 环境(二、https)
    linux 常见操作指令
    前端数据存储方案集合(cookie localStorage等)以及详解 (二)
    无法从其“Checked”属性的字符串表示形式“checked”创建“System.Boolean”类型
    VS2012使用验证控件出现[ASP.NET]WebForms UnobtrusiveValidationMode 需要 'jquery' 的 ScriptResourceMapping。請加入 ScriptResourceMapping 命名的 jquery (區分大小寫)。的解决办法。
    使用SHFB(Sandcastle Help File Builder)建立MSDN风格的代码文档
    常用正则表达式总结
    sql 中有关时间的语句
  • 原文地址:https://www.cnblogs.com/xiaohaoweiye/p/5633449.html
Copyright © 2011-2022 走看看