ios面试_ios 面试 - CSDN
  • 这个系列,我会选取实际面试过程中会问到的难点问题。几乎都是在面试大公司或者技术要求比较高的公司会问到的问题。希望会给即将找工作或者希望继续提升自己的小伙伴以帮助。
  • 疫情基本控制,同时面试也渐渐开始了,以下iOS面试题仅供参考,毕竟面试是不可控的,但懂得越多,自然机会越大! ####字节一面内容: 1、 自我介绍 2、 介绍一下简历中的一个项目 3、 面向对象的三个要素 4、 多态?...

    序言

    疫情基本控制,同时面试也渐渐开始了,以下iOS面试题仅供参考,毕竟面试是不可控的,但懂得越多,自然机会越大!

    字节一面内容:
    1、 自我介绍

    2、 介绍一下简历中的一个项目

    3、 面向对象的三个要素

    4、 多态?

    5、 Java,python,OC运行效率孰高?

    6、 Property,其中copy如何?

    7、 Property(nonatomatic, copy) NSMutableArray有什么问题

    8、 Copy和MutableCopy的区别

    9、 解释下类别,原理

    10、解释下封装,重载;

    11、 OC存在多重继承吗?

    12、了解表视图吗,解释一下复用原理

    13、说明一下表视图的滑动卡顿的优化方法

    14、viewDidLoad和viewDidAppear的调用时机(一次和多次的区别);

    15、页面间的传值方式有哪些(公有属性,公有方法和协议,block传值,通知,extern全局变量传值,
    NSUserDefault简单数据存储传值);

    16、通知和delegate的区别?

    17、 通知的发送和接收是否在同一线程?

    18、HTTP和HTTPS区别?

    19、OC中多线程一般有几个方案?

    20、了解NSURLConnection和Session吗?

    21、说一下NSURLSession具体的实现原理

    22、http的头部的几个码。;

    23、编程题:实现一个二叉树的倒置。

    字节二面内容:

    1、老虎吃羊问题。(博弈论,老虎要吃羊,假设所有老虎是理智的,即首先为了生存,其次为了饱腹,老虎吃了羊后会变成羊,同样会被其他老虎吃掉。现在,N只老虎和1只羊,请问N为多少时,老虎们会吃羊。动态规划问题,奇数吃,偶数不吃。)

    2、青蛙跳格子,斐波拉契数列;青蛙跳格子,斐波拉契数列;

    3、熟悉使用什么框架?

    4、如果让你自己实现SDWebImage的二级存储机制,你如果实现?

    5、@autorelease{ NSString s;}和NSString s;有什么区别?

    6、说一下你对autorelease的理解。

    7、说一下对于http的理解?

    8、http的返回状态码有了解吗?

    9、为什么说http是无状态的?

    10、为什么不用原生的APNS技术实现呢?

    11、了解GCD吗?

    12、说一下dispatch_group_t和dispatch_barrier_sync的区别吗?

    13、了解NSOperation吗?

    14、了解NSOperationQueue吗?

    字节三面内容:

    1、 算法题:求只有三项元素的数组中的顺序排列,时间复杂度要求O(n);

    2、 说一下你对OC程序编译和连接方面的理解?

    3、 说一下内存管理相关的操作?

    4、 说一下响应链的原理?

    5、 追问:hitTest有尝试过重写吗?

    6、 http, session和cookie有了解过吗;

    7、 线程和队列的关系?

    8、 CALayer和UIView了解吗?

    需要更多iOS面试文集资料,加iOS开发交流群:789143298,群文件直接获取
    ——点击加入:iOS开发交流群


    展开全文
  • iOS面试题基础

    2019-08-02 08:26:10
    分类、扩展、代理、通知、KVC、KVO、属性关键字 一、分类(Category) 1、分类的作用? 声明私有方法,分解体积大的类文件 2、分类的特点?...在运行时时期,将 Category 中的实例方法列表、协议列表、属性列表添加...

    分类、扩展、代理、通知、KVC、KVO、属性关键字

    一、分类(Category)

    1、分类的作用?

    声明私有方法,分解体积大的类文件

    2、分类的特点?

    可以为系统类添加分类。在运行时时期,将 Category 中的实例方法列表、协议列表、属性列表添加到主类中后(所有Category中的方法在方法列表中的位置是在主类的同名方法之前的),然后会递归调用所有类的 load 方法,这一切都是在main函数之前执行的。

    3、分类可以添加哪些内容?

    实例方法,类方法,属性(添加getter和setter方法,并没有实例变量,添加实例变量需要用关联对象)

    4、如果工程里有两个分类A和B,两个分类中有一个同名的方法,哪个方法最终生效?

    取决于分类的编译顺序,最后编译的那个分类的同名方法最终生效,而之前的都会被覆盖掉(这里并不是真正的覆盖,因为其余方法仍然存在,只是访问不到,因为在动态添加类的方法的时候是倒序遍历方法列表的,而最后编译的分类的方法会放在方法列表前面,访问的时候就会先被访问到,同理如果声明了一个和原类方法同名的方法,也会覆盖掉原类的方法)。

    5、如果声明了两个同名的分类会怎样?

    会报错,所以第三方的分类,一般都带有命名前缀

    6、分类能添加成员变量吗?

    不能。只能通过关联对象(objc_setAssociatedObject)来模拟实现成员变量,但其实质是关联内容,所有对象的关联内容都放在同一个全局容器哈希表中:AssociationsHashMap,由AssociationsManager统一管理。

    二、扩展(Extension)

    1、扩展的作用?

    声明私有属性,声明私有成员变量

    2、扩展的特点?

    编译时决议,只能以声明的形式存在,多数情况下放在在宿主类的.m中,不能为系统类添加扩展

    三、代理(Delegate)

    代理是一种设计模式,委托方声明协议,定义需要实现的接口,代理方按照协议实现方法

    一般用weak来避免循环引用

    四、通知(NSNotification)

    使用观察者模式用于实现跨层传递信息的机制。传递方式是一对多。

    五、KVO(key-value-observing)

    KVO是观察者的另一实现

    使用了isa混写(isa-swizzling)来实现KVO

    使用setter方法改变值KVO会生效,使用KVC改变值KVO也会生效,因为KVC会调用setter方法

    - (void)setValue:(id)value {
        [self willChangeValueForKey:@"key"];
        [super setValue:value];
        [self didChangeValueForKey:@"key"];
    }

    直接赋值成员变量不会触发KVO,因为不会调用setter方法,需要加上willChangeValueForKey和didChangeValueForKey

    六、KVC(key-value-coding)

    KVC可以通过key直接访问对象的属性,或者给对象的属性赋值,这样可以在运行时动态的访问或修改对象的属性

    当调用setValue:属性值 forKey:@”name“的代码时,,底层的执行机制如下:

    1、程序优先调用set<Key>:属性值方法,代码通过setter方法完成设置。注意,这里的<key>是指成员变量名,首字母大小写要符合KVC的命名规则,下同

    2、如果没有找到setName:方法,KVC机制会检查+ (BOOL)accessInstanceVariablesDirectly方法有没有返回YES,默认该方法会返回YES,如果你重写了该方法让其返回NO的话,那么在这一步KVC会执行setValue:forUndefinedKey:方法,不过一般开发者不会这么做。所以KVC机制会搜索该类里面有没有名为<key>的成员变量,无论该变量是在类接口处定义,还是在类实现处定义,也无论用了什么样的访问修饰符,只在存在以<key>命名的变量,KVC都可以对该成员变量赋值。

    3、如果该类即没有set<key>:方法,也没有_<key>成员变量,KVC机制会搜索_is<Key>的成员变量。

    4、和上面一样,如果该类即没有set<Key>:方法,也没有_<key>和_is<Key>成员变量,KVC机制再会继续搜索<key>和is<Key>的成员变量。再给它们赋值。

    5、如果上面列出的方法或者成员变量都不存在,系统将会执行该对象的setValue:forUndefinedKey:方法,默认是抛出异常。

    如果想禁用KVC,重写+ (BOOL)accessInstanceVariablesDirectly方法让其返回NO即可,这样的话如果KVC没有找到set<Key>:属性名时,会直接用setValue:forUndefinedKey:方法。

    当调用valueForKey:@”name“的代码时,KVC对key的搜索方式不同于setValue:属性值 forKey:@”name“,其搜索方式如下:

    1、首先按get<Key>,<key>,is<Key>的顺序方法查找getter方法,找到的话会直接调用。如果是BOOL或者Int等值类型, 会将其包装成一个NSNumber对象

    2、如果上面的getter没有找到,KVC则会查找countOf<Key>,objectIn<Key>AtIndex或<Key>AtIndexes格式的方法。如果countOf<Key>方法和另外两个方法中的一个被找到,那么就会返回一个可以响应NSArray所有方法的代理集合(它是NSKeyValueArray,是NSArray的子类),调用这个代理集合的方法,或者说给这个代理集合发送属于NSArray的方法,就会以countOf<Key>,objectIn<Key>AtIndex或<Key>AtIndexes这几个方法组合的形式调用。还有一个可选的get<Key>:range:方法。所以你想重新定义KVC的一些功能,你可以添加这些方法,需要注意的是你的方法名要符合KVC的标准命名方法,包括方法签名。

    3、如果上面的方法没有找到,那么会同时查找countOf<Key>,enumeratorOf<Key>,memberOf<Key>格式的方法。如果这三个方法都找到,那么就返回一个可以响应NSSet所的方法的代理集合,和上面一样,给这个代理集合发NSSet的消息,就会以countOf<Key>,enumeratorOf<Key>,memberOf<Key>组合的形式调用。

    4、如果还没有找到,再检查类方法+ (BOOL)accessInstanceVariablesDirectly,如果返回YES(默认行为),那么和先前的设值一样,会按_<key>,_is<Key>,<key>,is<Key>的顺序搜索成员变量名,这里不推荐这么做,因为这样直接访问实例变量破坏了封装性,使代码更脆弱。如果重写了类方法+ (BOOL)accessInstanceVariablesDirectly返回NO的话,那么会直接调用valueForUndefinedKey:方法,默认是抛出异常

    七、属性关键字

    1、读写权限:readonly,readwrite(默认)

    2、原子性:(atomic),nonatimic。atomic读写安全,但效率低,不是绝对的安全,比如操作数组,增加或移除,这种情况可以使用互斥锁来保证线程安全

    3、引用计数

    retain/strong

    assign修饰基本数据类型

    weak不改变修饰对象的引用计数,对象释放后,weak指针自动置为空

    copy分深拷贝和浅拷贝

    浅拷贝,对象指针的复制,目标对象指针和源对象指针指向同一块内存空间,引用计数增加

    深拷贝,对象内容的复制,开辟一块新的内存空间

    可变的对象的copy和mutableCopy都是深拷贝

    不可变对象的copy是浅拷贝,mutable是深拷贝

    copy方法返回的都是不可变对象

    @property (nonatomic, copy) NSMutableArray * array;这样使用会crash,因为copy的对象是不可变的

    NSString使用copy修饰不用strong修饰,用strong修饰一个name属性,如果赋值的是一个可变对象,当可变对象的值发生改变的时候,name的值也会改变,这不是我们期望的,是因为name使用strong修饰后,指向跟可变对象相同的一块内存地址,如果使用copy的话,则是深拷贝,会开辟一块新的内存空间,因此可变对象值变化时,也不会影响name的值。

     

     

    展开全文
  • 一、 js 与 原生OC交互方式: ...在iOS 7 之后Apple添加了一个新的库JavaScriptCore,用来做js交互。 首先导入JavaScriptCore 库,然后在OC 中获取上下文对象。在定义好JS需要调用的方法。JSContext对象conte...

    一、 js 与 原生OC交互方式:

           1.JS发起一个假请求,然后用UIwebView的代理方法拦截这起请求,再做相应的处理

           2.在iOS 7 之后Apple添加了一个新的库JavaScriptCore,用来做js交互。

           首先导入JavaScriptCore 库,然后在OC 中获取上下文对象。在定义好JS需要调用的方法。JSContext对象context[@”share”] 等于一个返回值为空的block。这个block 在子线程中调用,因此执行UI 操作需要回到主线程

    二、 OC调用JS

           1、webView stringByEvaluatingJavaScriptFromString:jsStr];

           2、继续使用JavaScriptCore库  JSContext 对象调用 evaluateScript:方法

           以上两个方法都是同步方法,如果JS方法比较耗时会造成界面卡顿。

           所以可以使用wkwebview 的 evaluateJavaScript:代替

          

    WKWebView优势:

    运行速度更快,占用内存低,大概是UIwebView 的四分之一到三分之一

    多进程,在APP的主进程之外执行;为空webView为多进程组件,他会从APP内存中分离内存到单独的进程中。当内存超过了系统分配给为空webView的内存时候,会导致为空webView浏览器崩溃白屏,但是APP不会crash。(APP会收到系统通知,并且尝试去重新加载页面)

    相反的UIwebView 和APP同一个进程,内存不够用时就会crash ,从而导致APP crash

    wkwebview 使用和手机Safari浏览器一样的nitro JavaScript引擎,相比于UIwebView的javaScript 引擎有非常大的性能提升

    wkwebview 是异步处理APP原生代码与JavaScript之间的通信,因此普遍上执行速度会更快

    消除了触摸延迟

    缺点:

    不能截屏

    不支持记录webkit 的请求

    APP退出会清湖HTML5的本地存储数据

    不支持accept cookies 的设置

    需要iOS 9 或更高版本

     

    三、线程

           线程安全

           1、互斥锁     @synchronized(所对象){}

           atomic  原子属性  为setter方法加锁   线程安全需要消耗大量的资源

           nonatomic  非原子属性

           2、NSLock

    3、递归锁 NSRecursivelock

    4、NSConditionLock条件锁

    5、GCD 信号量  dispatch_semaphore

    6、自选锁

    1、@synchronized 的效率最低,不过它的确用起来最方便,所以如果没什么性能瓶颈的话,可以选择使用 @synchronized。
    2、当性能要求较高时候,可以使用 pthread_mutex 或者 dispath_semaphore,由于 OSSpinLock 不能很好的保证线程安全,而在只有在 iOS10 中才有 os_unfair_lock ,所以,前两个是比较好的选择。既可以保证速度,又可以保证线程安全。
    3、对于 NSLock 及其子类,速度来说 NSLock < NSCondition < NSRecursiveLock < NSConditionLock 。

    线程间通信:

    两个线程之间要想互相通信,可以使用:NSMachPort 

    //1. 创建主线程的port    // 子线程通过此端口发送消息给主线程    NSPort *myPort = [NSMachPort port];

        //2. 设置port的代理回调对象    myPort.delegate = self;

        //3. 把port加入runloop,接收port消息    [[NSRunLoop currentRunLoop] addPort:myPort forMode:NSDefaultRunLoopMode];

        NSLog(@"---myport %@", myPort);

        //4. 启动次线程,并传入主线程的port    MyWorkerClass *work = [[MyWorkerClass alloc] init];

    (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;

    - (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait;

    进程间通信;

    共享存储系统消息传递系统管道:以文件系统为基础

    URL scheme

    Keychain

    Uipasteboard

    UIDocumentInteractionController

    Local socket

    Airdrop

    UiactivityViewController

    APPgroups

     

     

    线程保活:

    循环

    runloop

    1.获取RunLoop只能使用 [NSRunLoop currentRunLoop] 或 [NSRunLoop mainRunLoop];

    2.即使RunLoop开始运行,如果RunLoop 中的 modes 为空,或者要执行的mode里没有item,那么RunLoop会直接在当前loop中返回,并进入睡眠状态。

    3.自己创建的Thread中的任务是在kCFRunLoopDefaultMode这个mode中执行的。

    4.在子线程创建好后,最好所有的任务都放在AutoreleasePool中。

    如果不执行下列语句:

    [runLoop addPort:[NSMachPort port] forMode:NSRunLoopCommonModes];

     

     

    Runloop

    就是运行循环。保持程序的持续运行、处理APP中的各种事件(手势定时器等)

    节省CPU资源提高程序的性能,在有任务的时候做任务 ,在没任务的时候休息 空转

    runloop 和线程是一对一的

    系统默认五个mode

    NSDefaultRunloopMode

    UITrackingRunloopMode  为了保证滑动ScrollView滑动不受影响,在滑动的时候就主动切换到这个mode运行

    UITInitializationRunLoopMode  在刚启动APP的时候第一次进入的mode

    GSEventReceive  接收系统内部事件

    Common    包含default 和UItrackingMode  

    应用:

    1、延迟显示UIimageView 用runloop   performSelector:withObject:afterDelay:inmodes:

    2、NSTimer  需要加入mode

    3、常驻线程  线程保活

    4、在创建场主线程的时候加入 @autoreleasepool,在runloop睡眠的时候释放

     

    定时器:

    1. NSTimer 通过runloop来是实现,一般情况下较为准确,但当当前循环耗时操作较多时会出现延时的问题。同事也受所加入的runloopmode 的影响,commonmode(包含default、UItracking)
    2. CADisplayLink是基于屏幕刷新的周期,所以其一般很准时,每秒60次。其本质也是通过runloop,所以存在和NSTimer相同的问题
    3. GCD定时器是dispatch_source_t类型的变量,其可以实现更加精准的定时效果。GCD定时器实际上是使用了dispatch源(dispatch source),dispatch源监听系统内核对象并处理。通过系统级调用更加精准   (dispatch类似生产者消费者模式,通过监听系统内核对象,在生产者生产数据后自动通知相应的dispatch队列执行,后者充当消费者)。GCD通过dispatch_suspend()释放定时器

     

    ViewDidload 什么时候调用:(界面初始话操作,加载数据等)在view创建完毕后,不管是通过xib、Storyboard还是loadview自定义view

    1. view被加载的时候
    2. view Controller 用代码创建的时候
    3. view Controller通过nib解析的时候

    在UIViewController 的初始化方法中访问实例变量view,会导致延迟加载机制失效,会受到内存警告

    当访问UIViewController中的self.view时,如果view为nil 就会调用loadview

     

     

    iOS 程序在main 函数之前:

    1. 首先加载可执行文件
    2. 然后加载苹果的动态链接器dyld,(dyld是一个专门用来加载动态链接库的库)
    3. 执行从dyld开始,dyld从可执行的文件开始,递归加载所有的依赖动态链接库
    4. 动态链接库包括:iOS中用到的所以系统的framework,加载OC runtime方法的libobjec,系统级别的libSystem
    5. 所有动态链接库和我们APP的静态库.a和所有类文件编译后的.o文件,最终都由dyld 加载到内存中

    整个事件由苹果的动态链接器主导,完成运行环境的初始化后,配合imageLoader将二进制文件按格式加载到内存。

     

    OC 方法调用的过程原理:

    OC中的所有方法调用,最终都是转换成runtime中的一个C语言消息分发函数:objc_msgSend(消息接收者,方法名 ,参数。。。)

    这条消息发送之后,系统会在receiver的类对象的方法了吧中找这个方法,如果没找到,再到receiver的父类的方法列表中找,如此直到根类至找到为止,如果还没有找到会报出错误。(缓存:方法第一次被调用之后,方法会被存入一张缓存表,之后如果再被调用时就直接从缓存表中取出,以提高效率)。

    Runtime中对调用过程做了缓存,在抛出错误之前会进行动态决议和消息转发过程。

    若对象无法响应某个选择子,则进入消息转发流程:

    1、动态方法解析:+bool) resolveInstanceMethod:(SEL)selector

                               +(bool)resolvelassMethod:(SEL)selector

    2、备用接受者:

    • (id)forwardingargetForSelector(SEL)slector  (把这条消息转发给其他对象处理)
    1. 获取方法签名进行消息转发

    - (NSMethodSignature*)methodSignatureForSelector:

    1. 完整的消息转发

    - (void)forwardingInvocation(NSInvocation*)invocateion

     1、通过运行期的动态方法解析功能,我们可以在需要某个方法是在将其加入类中

    2、对象可以把其无法解读的某些消息转交给其他对象来处理

    3、经过上述两步后,如果还是没有办法处理消息,那就启动完整的消息转发机制

     

     

    OC类结构

    OC类是objc_class结构体

    它里面有isa指针、指向父类的super_class 指针、类名、类的版本信息、该类的实例变量大小、类信息供运行期使用的一些标识符、类的成员变量链表、方法定义的链表、方法缓存、协议链表

     

     

    UIView 和 CALayer

    所有的view都是由一个底层的Layer来驱动。Layer侧重于图形的显示,而view相当于layer的管理者。

    UIView 继承与UIResponder 而 CALayer 继承于NSObject。所以UIView 可以响应事件,而CALayer 则不能。

    每个UIView内部都有一个CALayer在背后提供内容的绘制和显示。两者都有树状层级结构,layer 内部有sublayers,view 内部有subviews

    layer 内部维护着三份layer tree ,分别是动画树、模型树、渲染树,在iOS 做动画的时候,我们修改动画的属性,在动画的其实是动画树,而最终展示在界面上的其实是提供view的modelayer

     

    设计模式

    1. 单例模式: 确保程序运行期某个类只有一个实例对象,用于资源共享控制
    2. 代理模式:一对一反向传值。当一个类的某些功能需要别的类来实现,但是又不确定具体会是哪个类实现
    3. 观察者模式:

    通知:  notification通知中心,注册通知中心,任何位置可以发送消息,注册观察者的对象可以接收。

    KVO 键值对改变  通知观察者

           4、工厂模式:工厂方式创建类的实例

    5、MVC 模式 :model 、view 、control  模型、视图、控制器对应用程序进行数据处理、业务逻辑和视图展示解耦

    6、MVVM模式: model、view、viewModel  将MVC中controller的业务逻辑提取到viewModel层,进行解耦合

    设计模式:并不是一种新技术,而是一种编码经验。 mvc设计模式 :模型,视图,控制器,可以将整个应用程序在思想上分成三大块,对应是的数据的存储或处理,前台的显示,业务逻辑的控制。  代理模式:代理模式给某一个对象提供一个代理对象,并由代理对象控制对源对象的引用单例模式:说白了就是一个类不通过alloc方式创建对象,而是用一个静态方法返回这个类的对象。系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为,比如想获得[UIApplication sharedApplication];任何地方调用都可以得到 UIApplication的对象,这个对象是全局唯一的。  观察者模式: 当一个物体发生变化时,会通知所有观察这个物体的观察者让其做出反应。实现起来无非就是把所有观察者的对象给这个物体,当这个物体的发生改变,就会调用遍历所有观察者的对象调用观察者的方法从而达到通知观察者的目的。  工厂模式:可以简单概括为同类型不同型号的产品有各自对应的工厂进行生产。

     

     

    @autoreleasepool

    1. 是自动释放池,让我们更自由的管理内存
    2. 当我们手动创建了一个@autoreleasepool,里面创建了很多临时变量,当@autoreleasepool结束的时候,里面的内存就回回收
    3. ARC 系统自动管理自己的autoreleasepool,runloop就开始iOS 中的消息循环机制,当一个runloop结束时系统才会一次性清理掉呗autoreleasepool 处理过的对象,其实本质上说是在本次runloop迭代结束时清理掉本次迭代期间被放到autoreleasepool中的对象。至于何时runloop结束并没有固定的duration。

     

    会产生大量临时变量的时候使用@autoreleasepool

    循环中创建了很多的临时对象,使用@autoreleasepool

    你生成了一个辅助数据线程,使用 @autoreleasepool

    长期在后台运行的任务

     

     

     

    Static

    Static 修饰局部变量 ,只会初始化一次,并且在程序中只有一份内存,可以延长局部变量的生命周期,改变了知道整个项目结束时才会被销毁

    Static修饰全局变量时,作用域仅限于当前文件

    1).函数体内 static 变量的作用范围为该函数体,不同于 auto 变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值; 2).在模块内的 static 全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问; 3).在模块内的 static 函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明它的模块内; 4).在类中的 static 成员变量属于整个类所拥有,对类的所有对象只有一份拷贝; 5).在类中的 static 成员函数属于整个类所拥有,这个函数不接收 this 指针,因而只能访问类的static 成员变量。

     

     

     

    Http 请求方式:

    1. opions  返回服务器针对特定资源所支持的HTML请求方法 或 允许客户端查看服务器性能
    2. get 向特定资源发出请求
    3. post 向指定资源提交数据(提交表单、上传文件)
    4. put 向指定资源位置上上传其最新内容
    5. head  与get请求类似,返回的响应中没有具体内容,用于获取报头
    6. delete 请求服务器删除request-URl所表示的资源
    7. trace 回显服务器收到的请求,用于测试和诊断
    8. connect 能够将连接改为管道方式的代理服务器

     

    在项目什么时候选择使用GCD,什么时候选择NSOperation?
    答: 项目中使用NSOperation的优点是NSOperation是对线程的高度抽象,在项目中使用它,会使项目的程序结构更好,子类化NSOperation的设计思路,是具有面向对象的优点(复用、封装),使得实现是多线程支持,而接口简单,建议在复杂项目中使用。
    项目中使用GCD的优点是GCD本身非常简单、易用,对于不复杂的多线程操作,会节省代码量,而Block参数的使用,会是代码更为易读,建议在简单项目中使用


     

    线程与进程的区别和联系

    1). 进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性 2). 进程和线程的主要差别在于它们是不同的操作系统资源管理方式。 3). 进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。 4.)线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉。所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。 5). 但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。

     

    一、TCP 是传输控制协议  transport control protocol  ,基于字节流传输,有连接,可以提供可靠地通信传输

           TCP充分实现了数据传输时的各种控制功能,可以进行丢包的重发,还可以对次序乱掉的分包进行顺序控制。TCP 作为一种面向连接的传输协议,只有在确认通信端存在时才会发送数据,从而避免数据流量的浪费。TCP 通过检验和、序列号、确认应答 和重发控制等机制实现可靠性传输。TCP 连接只能是点到点

    二、UDP 是用户数据协议 user data protocol ,基于数据报,无连接,不可靠

          UDP将部分控制转移到应用程序去处理,自己只提供作为传输层协议的最基本功能。对丢包乱序不做处理,UDP 支持 一对一、一对多、多对一、多对多通信

     

    编程步骤: TCP  1、创建一个socket    2、设置socket属性   3、绑定IP地址 端口信息到socket 上bind()    4、设置要连接的对方的IP地址和端口号   5、连接服务器 connect()   6、收发数据  receive ()  send() 7、关闭网络连接

             UDP  1、创建一个socket    2、设置socket属性   3、绑定IP地址 端口信息到socket 上bind()    4、设置要连接的对方的IP地址和端口号   5、发送数据 sendto()    6、关闭网络连接

     

    Viewcontroller 生命周期

    当一个视图控制器被创建,并在屏幕上现实的时候

    1、alloc   2、init  3、loadview  4、viewdidload  5、viewwillappear  6、viewdidappear

    当一个视图被移除屏幕并且销毁的时候的执行顺序

    1、viewwilldisappear   2、viewdiddisappear   3、dealloc

    关于viewdidunload  在发生内存警告的时候如果本视图不是当前屏幕正在显示的视图的话,viewdidunload将会被执行,本视图的所有子视图将被销毁已释放内存,此时开发者需要手动释放该控制器中创建的对象。

     

    iOS  APP性能测试:

    instrument

    1、leaks 内存泄漏  ,一般查看内存的使用情况,检查泄漏的内存,并提供了所有活动的分配和泄漏模块的类对象分配统计信息以及内存地址历史记录

    2、time profile 时间探测: 分析代码的执行时间,找出导致程序变慢的原因

    3、allocations 内存分配:检测内存使用、分配情况。跟踪工程的匿名虚拟内存和堆的对象提供类名和可选保留释放历史

     

    事件的分发和传递

    1. 当iOS 程序中发生触摸事件后,系统会将事件加入到UIApplication管理的一个任务队列中
    2. UIApplication将处于任务队列最前端的事件向下分发。即UIWindow
    3. UIWindow将事件向下分发,即UIView
    4. UIView 首先看自己是否能处理事件,触摸点是否在自己身上。如果能,那么继续寻找子视图
    5. 遍历子控件,重复以上两步
    6. 如果没有找到,那么自己就是事件处理者
    7. 如果自己不能处理,那么不做任何事情
    8. 该事件被废弃

    其中UIView 不接受事件处理的情况主要有一下三种:alph< 0.01   userinteractionEnable = NO   hidden = yes

     

    这个从父控件到子控件寻找处理时间最合适的view过程,如果父视图不接受事件处理,则子视图也不能接收事件

     

           响应者链:

           响应链是从最合适的view开始传递,处理事件传递给下一个响应者,响应者链的传递方向是事件传递的反方向,如果所有响应者都不处理事件,则事件被丢弃。

     

     

    数据持久化

    1、属性列表plist   用于存储在程序中不经常修改、数据量小的数据,不支持自定义对象存储

    2、nsuserdefautls  同样适合于存储轻量级数据,本质上就是一个plist ,也不支持自定义对象存储

    3、归档序列化存储

    可以直接将对象存储为文件,也可将文件直接解归档为对象,相对于plist文件与nsuserdefault  存储更加多样,支持自定义对象存储,归档后的文件是加密的,也更加安全

    4、Core data 

    5、数据库  FMDB

     

    谓词 NSPredicate 

    通过设置逻辑条件 对数据进行过滤

     

    volatile  是一个类型修饰符。该变量可能会被意想不到的改变。优化器在使用个这个变量时必须每次都小心的重新读取这个变量的值,而不是使用保存在寄存器里的备份。

    1. 并行设备的硬件寄存器
    2. 一个中断服务子程序中会访问到的非自动变量
    3. 多线程应用中被几个任务共享的变量

     

    一个参数既可以是const 还可以是volatile。一个例子是只读的状态寄存器,他可能会被意想不到的改变,而程序不应该视图去修改他

    一个指针可以使volatile。当一个中断服务子程序修改一个指向一个buffer的指针时

     

    什么是push

    客户端程序留下后门端口,客户端总是监听针对这个后门的请求,于是 服务器可以主动像这个端口推送消息

     

     

    常见第三方库:afnetworking 、SDWebImageView、Reactive Cocoa、 React Native

     

    block 本质: 是带有函数执行上下文环境的结构体,其中包含被调函数的指针

     

    离屏渲染:

    离屏渲染指的是GPU在当前屏幕缓冲区意外开辟了一个缓冲区进行渲染操作。对性能的影响主要是因为:创建了新的缓冲区以及上下文的频繁切换

    导致离屏渲染的原因:

    shouldRasterize 光栅化、遮罩masks、shadows 阴影、edgeantialiasing 抗锯齿、不透明、复杂形状设置圆角等、渐变

     

     

    UIView 的绘制原理

    当我们调用[UIView setNeedsDisplay]这个方法时 ,其实并没有立即进行绘制工作,系统会立即调用CALayer的同名方法,并且会在当前layer上打上一个标记,然后会在当前runloop将要结束的时候调用【CALayer display】这个方法 然后进入视图的真正绘制过程

    在CALayer display 这个方法的内部实现中会判断这个layer的delegate是否响应displaylayer这个方法,如果不响应这个方法,就回进入到系统会址流程中,如果响应这个方法,那么就会为我们提供异步绘制的入口

    异步绘制

    1假如我们在某一个时机调用了【view setNeedsDisplay】这个方法,系统会在当前runloop将要结束的时候调用【CALayer display】方法,然后如果我们这个layer的代理实现了【view displayerlayer】这个方法

    2、然后会通过子线程的切换,我们在子线程中去做一个位图的绘制,主线程可以去做一些其他的操作

    3、 在子线程中创建一个位图的上下文,然后通过CoregraphIC API 可以做当前UI空间的一些绘制工作,最后再通过CGBitmapContextCreateImage()这个函数来根据当前所绘制的上下文来生成一张cgimage图片

           4、最后回到主线程来提交这个位图,设置layer的contents属性,这样就完成了一个UI控件的异步绘制

     

     

    分类的实现原理:

    分类在编译过程中,会生成  类方法列表、实例方法列表、属性列表等,但是却没有 实例变量列表,分类所属类是存在实例变量列表的。对比实例方法列表,可以发现 分类的实例方法列表中,并未对分类属性生成getter /setter方法

    分类是在运行时进行加载的。

    把分类的饿实例方法、属性、协议 添加到类的实例对象中原本存储的实例方法、属性、协议列表的前面

    把分类的类方法和协议添加到类的元类上

     

     

    应用多线程的时候会出现什么问题,应如何避免问题的发生?

    多线程容易导致资源争抢,发生死锁现象.死锁通常是一个线程锁定了一个资源A,而又想去锁定资源B;在另一个线程中,锁定了资源B,而又想去锁定资源A以完成自身的操作,两个线程都想得到对方的资源,而不愿释放自己的资源,造成两个线程都在相互等待,造成了无法执行的情况。 

    避免死锁的一个通用的经验法则是:当几个线程都要访问共享资源A、B、C时,保证使每个线程都按照同样的顺序去访问它们,比如都先访问A,在访问B和C

    采用GCD中的栅栏方法,用并行队列去装载事件并异步去执行

     

    构建缓存时选用NSCache而非NSDictionary

    当系统资源将要耗尽时,NSCache可以自动删减缓存。如果采用普通的字典,那么就要自己编写挂钩,在系统发出"低内存"通知时手工删减缓存,NSCache会先行删减"最久未使用的"对象。

    NSCache并不会"拷贝"键,而是会"保留"它。此行为用NSDictionary也可以实现,但是需要编写比较复杂的代码。NSCache对象不拷贝键的原因在于:很多时候,键都是由不支持拷贝操作的对象来充当的。因此,NSCache对象不会自动拷贝键,所以说,在键不支持拷贝操作的情况下,该类用起来比字典更方便。

    NSCache是线程安全的,NSDictionary不是。在开发者自己不编写加锁代码的前提下,多个线程便可以同时访问NSCache。对缓存来说,线程安全通常很重要,因为开发者可能要在某个线程中读取数据,此时如果发现缓存里找不到指定的键,那么就要下载该键所对应的数据了。

    Static

    1).函数体内 static 变量的作用范围为该函数体,不同于 auto 变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值; 2).在模块内的 static 全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问; 3).在模块内的 static 函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明它的模块内; 4).在类中的 static 成员变量属于整个类所拥有,对类的所有对象只有一份拷贝; 5).在类中的 static 成员函数属于整个类所拥有,这个函数不接收 this 指针,因而只能访问类的static 成员变量。

     

    AsyncDisplayKit的使用

    它是一个UI框架,能在异步线程绘制修改UI,然后统一添加进内存 渲染出来。

    造成卡顿的原因:CPU 或 GPU消耗过大,导致再一次同步信号之间没有准备完成,没有内容提交,导致掉帧问题。

    优化原理:

    1. 布局:iOS 自带的autolayout在布局上存在性能瓶颈,并且只能在主线程进行计算。因此asdk弃用了autolayout自己设计了一套布局方案
    2. 渲染:对于大量文本、图片等的渲染,uikit组件只能在主线程并且可能会造成GPU绘制的资源紧张。ASDK 使用了一些方法,如图层的预混合、并且异步在后台绘制图层,不阻塞主线程的运行
    3. 系统对象创建与销毁:uikit组件封装了CALayer图层的对象,在创建、调整销毁的时候,都会在主线程消耗资源。ASDK设计了一套NODE机制,也能够调用

    ASDK最大特点就是异步。将消耗时间的渲染、布局、图片解码、及其他UI操作全部移出主线程,这样主线程就可以及时响应用户的操作,来达到流畅运行的目的

     

    iOS 应用加密技术防止反编译

    1. 本地数据加密
    2. URL编码加密
    3. 网络传输数据加密
    4. 方法体、方法名高度混淆
    5. 程序结构混排加密
    展开全文
  • 荐书丨iOS面试之道

    2018-08-12 22:14:38
    点击上方“程序人生”,选择“置顶公众号”第一时间关注程序猿(媛)身边的故事117道面试题融入作者对问题本质的深刻理解和多年工作经验的沉淀助你得到理想的Offer不仅是面试...
        

    点击上方“程序人生”,选择“置顶公众号”

    第一时间关注程序猿(媛)身边的故事


    117道面试题融入作者对问题本质的深刻理解和多年工作经验的沉淀

    助你得到理想的Offer

    不仅是面试指南

    也是构建iOS知识体系的基本框架


    “你会反转二叉树吗?不会?那么对不起……”

    当闻名遐迩,编写了几乎是业界标准的Homebrew的作者Max Howell在面试时被 Google 以算法题拒绝后,我不禁开始重新思考,面试为什么这么重要,在面试中有没有什么能帮助我们遂愿的必杀技或者小窍门。Max Howell是幸运的,因为他有着社区内无与伦比的声望和漂亮的项目履历,Google将这扇门关上后,Apple 又为他开了一扇窗。但是,对可能资质平平,似乎也没有什么闪光点的我们来说,要怎么做才能求到一个自己心仪已久的职位,其实是一件非常值得细细琢磨一番的事情。


    面试几乎是每个社会人一生必然会经历几次的社会活动,但是,由于它发生的频率不高,很容易被人忽视。我在面试别人时,最大的感受就是有不少应聘者其实并没有做好万全的准备。很多时候,应聘者虽然可能十分优秀,但在面试时总感觉就差临门一脚:要么是因为面试礼仪不足,让人觉得无法合作;要么是因为交流时过于紧张,导致理解偏差;要么是在做面试题时因为缺乏经验,无法很快抓住问题本质。这些往往都是准备不足,如果由于这样的原因导致面试失败,就非常可惜了。


    本书的两位作者分别是中美两国知名“大厂”的高级从业人员,有丰富的面试(或面试别人)经验。他们合作编写了本书,想要解决的就是上面提到的问题。书中内容涵盖广泛:从面试前的职位调研、简历准备,到具体的算法设计、iOS开发中的常见问题,再到最后的面试总结、工作的挑选,都有所涉及。在保证覆盖面的前提下,本书对一些重点进行了深入讲解:比如,对常见算法给出了具体的参考实现,对常见的知识点误用和考点进行了深入的原理分析。另外,本书中很多问题都带有关键字,通过查询书中的关键字,读者可以概览相关知识,并迅速建立关于这个关键字的知识网络。作者结合自己的行业经验和对行业现状的分析,不仅向应聘者提出了问题,更一一详尽地给出了解决的方式和建议,可谓字字珠玑,让人相见恨晚。


    通过阅读本书,你不仅可以准备面试时的技巧和问题,还可以更多地了解iOS“大厂”的技术人员所关注和重视的技术点。即使你在短期内不参加面试,也可以通过阅读本书开阔视野,并对自己的知识体系查缺补漏。这不仅对你的下一次面试有所助力,也可以帮助你精进实力,在现在的工作中更加游刃有余。


    好了,现在是时候来看一看两位作者会带给我们怎样的“思维碰撞”了。


    王  巍

    640?wx_fmt=png

    主要内容

    第1部分为面试准备。这部分详谈了求职中遇到的基本问题,唐巧老师根据其多年的经验现身说法,在面试流程、简历投递、复习准备方面给出了完善的参考意见和建议。


    第2部分为算法知识。作为对程序员基本功的考查,算法几乎是各种水平的程序员都要面对的必考内容。该部分采用Swift语言重新审视了多种数据结构和算法原理,可以说是为iOS开发者量身打造的算法解答。


    第3部分为iOS专业问答,分为语言工具、系统框架和经验之谈,采用问答的形式来详细介绍。其中,第3章语言工具主要针对iOS的主流开发语言Objective-C和Swift进行分析和对比,同时也整理了 Xcode编辑器的使用技巧和经验。正所谓,工欲善其事,必先利其器,本章主要考查的是开发者对工具和语言特性的掌握。第4章系统框架则是从视图、网络、设计模式等方面考查开发者的开发水准,这是任何一名合格的iOS开发者都应该具备的基本素养。第5章是经验之谈,主要包括一些进阶内容的提问和解答,考查的是iOS开发者的功力。


    作者简介

    故胤道长

    卡内基梅隆大学硕士毕业,常年居住于美国的iOS开发者;先后就职于Uber、Amazon

    GitHub全美前20名的Swift开源作者


    唐巧

    资深 iOS 开发者

    拥有超过10万个微信公众号和微博粉丝,一直努力分享iOS相关知识

    著有《iOS开发进阶》 一书

    现任猿辅导公司,小猿搜题产品技术负责人


    大咖推荐

    本书内容涉及面试前的准备、算法和数据结构、UI设计、并发、网络、设计模式等面试中经常被问到的问题,对iOS新手程序员来说,这是一本不错的书。其中的面试知识也适用于如Google、Amazon、Facebook等国际大公司。另外,本书也给出了一个iOS程序员的技能树地图,除应对面试外,只要你沿着这条路径钻研下去,就一定能够开启未来更为广阔的天地。

    ——程序员 陈皓(左耳朵耗子)


    如何面试,面试前需要达到什么样的水平,是初学者经常问的问题。而一般面试方法都不被当作硬实力,不过这个软实力往往直接决定了你是否被录用,以及薪资如何。可惜,很少有业内的高手愿意在这样的基本问题上发声,所以,故胤道长和唐巧两位高手写的这本书就显得更加珍贵,非常值得阅读。

    ——老iOS程序员 Tinyfool


    本书介绍了iOS面试时需要的知识和全新的面试趋势。第1章对面试的总结让人身临其境,第2章算法基础精彩实用,后面的章节对各个知识点采用问答方式来介绍,问题丰富,有代表性,解答条理清晰,有针对性。这是一本很有价值的书。

    ——滴滴iOS技术专家 戴铭


    本书为iOS程序员面试量身定制,既有关键算法知识的分析,又有全新iOS面试题的解析;对技术难点的讲解深入细致,易于吸收。对正在准备面试的同学来说,是一本难得的好书。

    ——iOS杂货铺店主 Peak


    本书的算法基础一章结合Swift语言和函数式编程思想,详细、具体地介绍了iOS开发过程中经常遇到的算法问题,在一问一答间还融入了作者对问题本质的深刻理解和多年工作经验的沉淀,非常精彩,值得阅读。

    ——支付宝iOS工程师 念茜


    作为技术研发人员,最终还是要靠自身实力说话。本书的每一节内容都是作者结合自身的实战经验精雕细琢而成的,简洁而有深度,称得上字字珠玑。本书不仅可以当作面试指南,也可以作为我们的iOS知识体系的基本框架,值得细细研读。

    ——京东iOS工程师 南大


    程序员面试经验在网上随处可见,但是内容良莠不齐。如果你是一名iOS程序员,那么本书是不错的选择。本书不仅涵盖简历准备、算法知识等基础,还对面试所需的开发语言、框架和架构都做了分析和答疑,是一本值得面试者阅读的好书。

    ——微信iOS工程师 芒果


    本书是一本优质的面试指南:融合了简历修改、面试准备、算法基础、函数式编程等当下全新、实用的iOS面试开发内容,并结合作者多年iOS开发工作和开源经验,为读者介绍了iOS开发者应该理解并熟悉的重点。

    ——亚马逊iOS工程师 老驴


    本书写给谁看

    如果你是一名iOS开发者,并且正准备跳槽,那么本书是一本不错的复习参考书;如果你没有面试计划,那么本书也可以帮助你对iOS知识进行提纲挈领的整理;如果你是面试官,那么希望本书能为你提供考查应聘者的依据和源泉;对于具有其他背景的软件工程师,若想一窥iOS世界的知识框架,本书也是不错的切入点。

    640?wx_fmt=png

    扫码购书


    点击文末「阅读原文」,发现更多好书。


    本期评奖规则

    在本文下方留言,说说你想要这本书的理由是什么~

    我们会从留言用户中,按照留言点赞数,抽取排名在第2、4和6名的3位幸运者,送出本书。


    开奖时间:8月14日当天(以当天小编开奖时看到的名次顺序为准)


    展开全文
  • iOS面试题(七)

    2019-08-08 16:22:40
    (1)get是从服务器上获取数据,post是向服务器传送数据。 (2)在客户端,Get方式在通过URL提交数据,数据在URL中可以看到;... (3)对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器...

    1、http 的post与get区别与联系,实践中如何选择它们?

    (1)get是从服务器上获取数据,post是向服务器传送数据。
    (2)在客户端,Get方式在通过URL提交数据,数据在URL中可以看到;POST方式,数据放置在HTML HEADER内提交。
    (3)对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。
    (4)GET方式提交的数据最多只能有1024字节,而POST则没有此限制。
    (5)安全性问题。正如在(1)中提到,使用 Get 的时候,参数会显示在地址栏上,而 Post 不会。所以,如果这些数据是中文数据而且是非敏感数据,那么使用 get;如果用户输入的数据不是中文字符而且包含敏感数据,那么还是使用 post为好。
    Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE。URL全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,而HTTP中的GET,POST,PUT,DELETE就对应着对这个资源的查,改,增,删4个操作。GET一般用于获取/查询资源信息,而POST一般用于更新资源信息。

    2、检查内存管理问题的方式有哪些?

    1)点击Xcode顶部菜单中的ProductàAnalyze。这种方法主要可以查看内存泄露,变量未初始化,变量定义后没有被使用到
    2)使用Instrument工具检查。点击Xcode顶部菜单中的ProductàProfile,弹出一个界面,选择左侧的Memory后,再选右侧的Leaks。
    3)人工检查

    3、NSString 对象为何用copy?NSMutableString呢?

    NSString在Objective-C中是一种非常特殊的对象,其引用系数不受引用计数规则的控制。NSString对象不管是alloc、retain还是release,其引用计数都是-1。对于NSString来说,用alloc和用retain都是指向同一块内存,区别不大。对于NSMutableString来说,alloc实际上就是开辟了一块新内存,再把内容复制进来,而retain内存不变引用计数+1。如果NSMutableString中的内容被改变了的话,用retain之后内容也被改变。这是写程序过程中所不想要的结果。所以这种情况下,用 copy比较安全。苹果的官方SDK,都把NSString属性声明为copy,比如UILabel中的两个属性。

    4、谈谈obj-c的优缺点?

    优点:

    1. Cateogies

    2. Posing

    3. 动态识别

    4. 指标计算

    5)弹性讯息传递

    1. 不是一个过度复杂的 C 衍生语言

    2. Objective-C 与 C++ 可混合编程

    缺点:

    1. 不支援命名空间机制
      :须在其类别名称加上前缀,时常引致冲突。
    2. 不支持运算符重载
      3) 不支持多重继承:只容许对象继承一个类别
      4)使用动态运行时类型,所有的方法都是函数调用,很多常见的编译时性能优化方法都不能应用于Obj-C(如内联函数、常数传播、交互式优化、纯量取代与聚集等),性能劣于类似的对象抽象语言(如C++)。

    5、堆和栈的区别?

    1.申请大小:
    栈:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是 系统预先规定好的,在WINDOWS下,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示 overflow。因此,能从栈获得的空间较小。
    堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。
    2.碎片问题:对于堆来讲,频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。对于栈来讲,则不会存在这个问题,因为栈是先进后出的队列,他们是如此的一一对应,以至于永远都不可能有一个内存块从栈中间弹出
    3.分配方式:堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配由 alloca函数进行分配,但是栈的动态分配和堆是不同的,他的动态分配是由编译器进行释放,无需我们手工实现。
    4.分配效率:栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。堆则是C/C++函数库提供的,它的机制是很复杂的。

    6、obj-c有多重继承么?不是的话有什么替代方法?

    cocoa 中所有的类都是NSObject 的子类,多继承在这里是用protocol 委托代理来实现的。你不用去考虑繁琐的多继承,虚基类的概念。多态特性在 obj-c 中通过委托来实现。

    7、问你觉得iOS7为什么要扁平化,扁平化和之前的比有什么优势(北京龙宇北腾)

    开放型问题,参考答案:
    苹果首席设计师谈为何会在iOS上选择扁平风格http://ndnews.oeeee.com/html/201306/11/71078.html
    在iOS 6之前,拟真设计(拟物化设计)作为图标设计和启动应用时的设计备受重视。说到拟真设计的背景,计算机起初就是通过接近现实来让用户明白其功能的。比如,电子书如果没有设计成木纹风格的书架就无法传达其概念,看到翻页日历才会联 想到日历。在不习惯用计算机的人看来,电脑上的垃圾箱要跟实际丢弃文件这件事接近才容易理解。因此计算机开始采用拟真设计。而如今,数字化已经成熟,原本采用隐喻设计的东西不需要再使用比喻了。在计算机中,电子邮件不断独立发展,已经不需要用以前的隐喻设计来做说明了。如果“硬要”采用以前的隐喻设计,变得过于写实,其本身的视认性就会降低。比如“报刊杂志”的木纹和质感现在已成了多余的信息。对于使用该应用的人而言,想看的是其中的内容,只需要画一条能够识别内容的线即可。现在,整个行业都准备放弃不必要的写实概念。就拿电子书来说,以前曾就翻页时在多大程度上表现出纸张背面投过来的字迹等进行过激烈的讨论。而现在设计电子书的前提不再是隐喻纸质书的背面字迹,如何让用户顺畅地阅读内容才更为重要。现实已经超越了隐喻设计,UI世界不再需要像以前那样模仿现实,而是要建立全新的原始状态(original position)。因此,仅用现有的隐喻设计已经无法表现。比如:iOS 6的“报刊杂志” 就做成了整个书架的样子,而与此相关的设计还有Passbook、备忘录与各种纹理界面。拟真设计实例木纹和质感对于接受内容的人而言,已成为多余的信息。系统设计领导者认为用户已经习惯了触摸屏,所以他们不再需要具有物理外形的按钮。因此我们自由设计的灵活度很大,不必过于拘泥现实世界。我们尝试创建的系统环境不再那么具体化。iOS系统同所有模拟现实世界的外观设计,用更数字化的方式加以呈现,使其对现实世界的依赖越来越少。iOS 7的“电话”和“邮件”图标。虽然变得扁平,却沿用了iOS 6的图标。“电话”图标在iOS 7中为电话机模样,“邮件”图标也沿用了信封的设计。苹果并未放弃以前的iOS用户,iOS 7也是对iOS 6的正常升级,因此还有很多直接沿用和继承的部分。如果变得完全不一样了,就会变成无人了解的世界,因此也有自我模仿和简化的一面。拟物化应用在形象的优势背后,同时也会为用户带来许多不必要的噪音。 Windows 的 Metro 则更直观。在当前人与信息的交互下,我们仅需要一个符号就能理解功能。”如果对比一下 Metro 风格的界面与当前iOS界面我们就能感觉到,虽然 Retina 屏幕让显示效果非常优秀,但整个界面五颜六色,信息噪音非常高。而Metro风格的界面则更“符号化”,界面整洁,并且当我们需要寻找某个功能的时候,能迅速通过这些符号化的图形定位到该功能。因此,从拟物化到扁平化的设计过度,更像是一个人机交互发展的过程,在早期我们需要用相似图形去表现计算机功能,而当互联网渗透进入生活,每个人几乎都已经拥有十年以上的网龄之后,扁平化设计则更佳。这在当前的苹果与微软之间能看到巨大的差异,而谷歌则有点中庸,选择了一种介乎于拟物化与扁平化的设计风格,不提供过多的细节,也不过于简化。从Chrome Logo的变化就能看得出来,原本立体、多细节的Logo 变为扁平化的Logo。

    8、假如ios8由你设计你将怎样设计(北京龙宇北腾)

    开放型问题,现在已经出来了。

    9、谈谈安卓与苹果的优缺点(北京龙宇北腾)

    参考答案:苹果系统优点是左右流畅,软件多,界面华丽,图标统一,很美观;缺点是系统封闭,不允许用户过多的个性化设置,而且只能在苹果手机上用。安卓系统优点是开放,可以自己扩展的东西很多,支持的硬件也多,各个价位的手机都有;缺点就是软件太杂乱,兼容性有问题,图标混乱不美观。iOS的确比android流畅,这仅仅体现在较大软件切换时,其他差不多流畅,iOS并不能做到完全后台,如果它完全后台估计也不会比安卓流畅多少。反之,如果安卓只是注重单个运行,流畅度也会大大提升,iOS系统更新没有android那么频繁,爱体验的人会选安卓,那些怕烦的会选iOS。iOS的硬件需求选不及android,以至于android机会相对iOS较热,较费电额。
    android机优缺点
    优点
    1.可以自定义桌面 以及各类插件
    2.部分手机支持FM收音机
    3.各种ROM刷机 正所谓萝卜白菜各有所爱 众多ROM里 总有适合你的
    4.实体按键比iphone多 有些操作会很方便 例子“我看电子书的时候 有一个按键可以设置为翻页 按一下翻一页”
    5.随意换电池,也可以用大容量电池【换特殊背壳才行】
    6.机型多,1000左右的也有,四五千的也有 选择多
    缺点
    1.机型众多导致的应用不通用,每个机器都要找自己专用的
    2.机型升级过快导致【拼硬件】的现象,用户体验较差
    3.各种ROM良莠不齐,有的狂吃电量之类的缺陷
    4.机型多导致的 某种机器零件稀缺,维修困难 例【我的G3坏了,人家告诉我修好的钱能换个新的…汗啊 才出了几年】
    5.一些老机器被Google抛弃 没有官方升级
    关于后台的问题每人都有自己的看法,我就说下【自己的看法】 我比较新欢ios的伪后台因为伪后台不影响机子的使用,而我用过的android机 总需要关后台要不然就会很卡,经常有因为后台程序过多导致 来电话无法接听 因为内存不够
    下面说iphone的优缺点
    优点
    1.简单易懂,容易操作
    2.应用程序多,质量好,种类齐全
    3.硬件和软件高度匹配,硬件能很好地运转软件,软件能很好地发挥硬件的机能
    4.配件多 各种壳子 镜头
    5.用户体验好
    6.手机质感好【不知道算不算】
    缺点
    1.贵 【不过可以买3Gs】
    2.【中国区】售后服务不完善 导致维修一下就好好几百
    3.易遭小偷关顾
    4.软件收费【不过一般的10块左右 贵的大概60以内吧 少吃顿必胜客 大M 就好了】
    5.易造成攀比现象
    6.实体按键少【不过这是苹果的特色 无伤大雅】

    10、对安卓新版本的理解(北京龙宇北腾)

    11、什么 点阵密度 视觉差(北京龙宇北腾)

    12、越狱后消息推送有什么不同

    在这里插入图片描述

    13、有方法查看当前系统内存使用情况吗?(北京龙宇北腾)

    1.静态分析
    通过静态分析我们可以最初步的了解到代码的一些不规范的地方或者是存在的内存泄漏,这是我们第一步对内存泄漏的检测。当然有一些警告并不是我们关心的可以略过。
    2.通过instruments来检查内存泄漏
    这个方法能粗略的定位我们在哪里发生了内存泄漏。方法是完成一个循环操作,如果内存增长为0就证明我们程序在该次循环操作中不存在内存泄漏,如果内存增长不为0那证明有可能存在内存泄漏,当然具体问题需要具体分析。
    3.代码测试内存泄漏
    在做这项工作之前我们要注意一下,在dealloc的方法中我们是否已经释放了该对象所拥有的所有对象。观察对象的生成和销毁是否配对。准确的说就是init(创建对象的方法)和dealloc是否会被成对触发(简单说来就是走一次创建对象就有走一次dealloc该对象)。
    下面是自己遇到的一些比较隐秘的造成内存泄漏的情况:
    1.两个对象互相拥有:也就是说对象a里面retain/addSubview了b对象,b对象同时也retain/addSubView了a对象。注意:delegate不要用retain属性,要用assign属性也会导致互相拥有。
    2.有时候需要用removeFromSuperView来释放:具体说明,也许我的a对象拥有一个b对象,b对象add到了c对象上,而在我们的设计中b对象的生命周期应该和a对象相同;这时候只一句[b release]/self.b = nil是不能把b对象释放掉的(一般情况下release会使其retainCount-1,[super dealloc]会再次将所有subView的retainCount-1,而b并不是a的subView,所有最后的一次-1没有了);所以我们需要在之前加上[b removeFromSuperView]。

    搜房网面试问题大概:(写什么问什么)

    1、代理通知kvo在不使用的时候怎么做?搜房网

    .通知中心Notification Center,它是一个单例对象,允许当事件发生时通知一些对象。它允许我们在低程度耦合的情况下,满足控制器与一个任意的对象进行通信的目的。这种模式的基本特征是为 了让其他的对象能够接收到在该controller中发生某种事件而产生的消息,controller用一个key(通知名称)。这样对于 controller来说是匿名的,其他的使用同样的key来注册了该通知的对象(即观察者)能够对通知的事件作出反应。
    优势:
    1.不需要编写多少代码,实现比较简单;
    2.对于一个发出的通知,多个对象能够做出反应,即1对多的方式实现简单
    3.controller能够传递context对象(dictionary),context对象携带了关于发送通知的自定义的信息
    缺点:
    1.在编译期不会检查通知是否能够被观察者正确的处理;
    2.在释放注册的对象时,需要在通知中心取消注册;
    3.在调试的时候应用的工作以及控制过程难跟踪;
    4.需要第三方对喜爱那个来管理controller与观察者对象之间的联系;
    5.controller和观察者需要提前知道通知名称、UserInfo dictionary keys。如果这些没有在工作区间定义,那么会出现不同步的情况;
    6.通知发出后,controller不能从观察者获得任何的反馈信息。
    随便介绍下.委托delegation和键值观察key value observing,KVO

    2、数据库访问的时候,多线程中锁住怎么办? 搜房网

    3、运行时你是怎么理解的,怎么用的? 搜房网

    ObjC Runtime 其实是一个 Runtime 库,基本上用 C 和汇编写的,这个库使得 C 语言有了面向对象的能力(脑中浮现当你乔帮主参观了施乐帕克的 SmallTalk 之后嘴角一抹浅笑)。这个库做的事前就是加载类的信息,进行方法的分发和转发之类的。OC是一种面向runtime(运行时)的语言,也就是说,它会尽可能地把代码执行的决策从编译和链接的时候,推迟到运行时。这给程序员写代码带来很大的灵活性,比如说你可以把消息转发给你想要的对象,或者随意交换一个方法的实现之类的。这就要求runtime能检测一个对象是否能对一个方法进行响应,然后再把这个方法分发到对应的对象去。我们拿 C 来跟 ObjC 对比一下。在 C 语言里面,一切从 main 函数开始,程序员写代码的时候是自上而下地,一个 C 的结构体或者说类吧,是不能把方法调用转发给其他对象的。这个问题其实浅涉及到两个概念,运行时和多态。 简单来说,运行时机制使我们直到运行时才去决定一个对象的类别,以及调用该类别对象指定方法。 多态:不同对象以自己的方式响应相同的消息的能力叫做多态。意思就是假设生物类(life)都用有一个相同的方法-eat; 那人类属于生物,猪也属于生物,都继承了life后,实现各自的eat,但是调用是我们只需调用各自的eat方法。 也就是不同的对象以自己的方式响应了相同的消息(响应了eat这个选择器。因此也可以说,运行时机制是多态的基础。比如KVO中我们就用了。

    4、你单例怎么理解怎么用的? 搜房网

    Singleton Pattern单例设计模式,通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。类只能有一个实例,而且必须从一个为人熟知的访问点对其进行访问,比如工厂方法。这个唯一的实例只能通过子类化进行扩展,而且扩展的对象不会破坏客户端代码。例如,UIApplication的sharedApplication方法,任何时候都会返回一个当前应用程序的UIApplication实例。在程序中,我需要一系列的对象,他们每一个内部都包含有一组变量和功能,是静态的,而且整个程序都只需要拥有一个该类的对象。例如:1.控制程序执行的命令器;2.管理数据库;3.音效控制;4.文件处理

    5、sdwebimage缓存图片怎么实现的,在内存中有缓存吗? 搜房网

    SDWebImage托管在github上。这个类库提供一个UIImageView类别以支持加载来自网络的远程图片。具有缓存管理、异步下载、同一个URL下载次数控制和优化等特征。SDWebImage提供了如下三个category来进行缓存。MKAnnotationView(WebCache)、UIButton(WebCache)、UIImageView(WebCache)。
    SDImageCache类提供一个创建空缓存的实例,并用方法imageForKey:来寻找当前缓存。UIImage *myCachedImage = [[SDImageCache sharedImageCache] imageFromKey:myCacheKey]; 存储一个图像到缓存是使用方法storeImage: forKey: 默认情况下,图像将被存储在内存缓存和磁盘缓存中。如果仅仅是想内存缓存中,要使用storeImage:forKey:toDisk:方法的第三个参数带一负值来替代。

    6、来说说oc这门语言吧,和c c++比,你觉得哪个效率高,高到哪里了? 搜房网

    object_c比C++稍慢,是因为object_c的一些语言特性,比如反射,影响了执行效率。区别主要有以下一些方面。单一继承:Objective-C不支持多重继承,(同Java和Smalltalk),而C++语言支持多重继承。动态:Objective-C是动态定型(dynamicaly typed)所以它的类库比C++要容易操作。Objective-C 在运行时可以允许根据字符串名字来访问方法和类,还可以动态连接和添加类。C++ 跟从面向对象编程里的Simula67(一种早期OO语言)学派,而Objecive-C属于Smalltalk学派。 在C++里,对象的静态类型决定你是否可以发送消息给它,而对Objecive-C来说,由动态类型来决定。Simula 67学派更安全,因为大部分错误可以在编译时查出。而Smalltalk学派更灵活,比如一些Smalltalk看来无误的程序拿到Simualr 67那里就无法通过。从很多方面来看,C++和Objective-C的差别,与其说时技术上的,不如说是思维方式上的

    7、还有GCD用的那些api, 怎么处理线程间依赖, GCD的group操作有什么? 搜房网

    GCD是底层的C语言构成的API,提供了一种新的方法来进行并发程序编写。从基本功能上讲,GCD有点像NSOperationQueue,他们都允许程序将任务切分为多个单一任务然后提交至工作队列来并发地或者串行地执行。GCD比之NSOpertionQueue更底层更高效,并且它不是Cocoa框架的一部分。GCD的API很大程度上基于block,当然,GCD也可以脱离block来使用,比如使用传统c机制提供函数指针和上下文指针。实践证明,当配合block使用时,GCD非常简单易用且能发挥其最大能力。
    如果NSOperation对象有执行顺利要求的话,比如operationB需要在operationA执行完毕后才可以 执行,那就可以通过设置NSOperation之间的依赖关系来实现:[operationB addDependency:operationA]。
    在这里插入图片描述
    同步操作不会新建线程、操作顺序执行(没用!)同步任务中包含同步会造成线程阻塞
    异步操作会新建线程、操作顺序执行(非常有用!)

    8、字符串的内存,对象方法和类方法创建其内存和地址有什么区别?搜房网

    9、Meta-class?搜房网

    类的实例对象的 isa 指向该类;该类的 isa 指向该类的 metaclass。成员方法记录在class method-list中,类方法记录在meta-class中。即instance-object的信息在class-object中,而class-object的信息在meta-class中。meta-class 是 Class 对象的类。每个 Class 都有个不同的自己的 meta-class(因此每个 Class 都可以有一个自己不同的方法列表)。也就是说每个类的 Class 不完全相同。meta-class 总是会保证 Class 对象会有从基类继承的所有的的实例和类方法,加上之后继承的类方法。如从 NSObject 继承的类,就意味着在所有的 Class(和 meta-class)对象中定义了所有从 NSObject 继承的实例和协议方法。所有的 meta-class 使用基类的 meta-class(NSObject 的 meta-class 用于继承自 NSObject 的类)作为他们自己的类,包括在运行时自己定义的基础的 meta-class。

    10、创建一个属性对外只读、对内可读可写?搜房网

    属性就是用来封装的,尤其是属性还可能改变的时候,所谓封装就是在外面只能看,只能读,在里面是真正的操作,有时可以改变。细节的改变不影响外边的读,用,就用get()和set()最好。
    public XX getXX()
    private void setXX(XX xx)

    11、在类扩展中重写@property?搜房网

    12、协议?搜房网

    13、如果在发送异步请求的情况下,当前的界面删除了,会出现什么后果,如何解决?搜房网

    14、消息推送是怎么现实的?

    iOS消息推送的工作机制可以简单的用下图来概括:
    在这里插入图片描述
    Provider是指某个iPhone软件的Push服务器,APNS是Apple Push Notification Service的缩写,是苹果的服务器。
    上图可以分为三个阶段:
    第一阶段:应用程序把要发送的消息、目的iPhone的标识打包,发给APNS。
    第二阶段:APNS在自身的已注册Push服务的iPhone列表中,查找有相应标识的iPhone,并把消息发送到iPhone。
    第三阶段:iPhone把发来的消息传递给相应的应用程序,并且按照设定弹出Push通知。
    在这里插入图片描述
    从上图我们可以看到:
    1、应用程序注册消息推送。
    2、iOS从APNS Server获取device token,应用程序接收device token。
    3、应用程序将device token发送给PUSH服务端程序。
    4、服务端程序向APNS服务发送消息。
    5、APNS服务将消息发送给iPhone应用程序。

    15、一上来,直接就说,我给你出个简单的,你给我写一个贪吃蛇的算法?金山面试

    16、然后,还有一个面试是,请写一个类似于NSMutableArray的类,可以添加,删除,以及如何以最快的速度查找某个元素?金山面试

    17、群组通讯怎么做?xmpp里面不是提供有接口吗?那里面除了一对一通信聊天之外,还有群聊的接口(金山面试)

    18、算法:给一个数字,判断从左读和从右读是否是一致的?例如12321和4444(北京品科艺科技有限公司)

    19、给一个数组[1、3、2、4、8]排序后[1、2、3、4、8]?北京品科艺科技有限公司

    20、怎么用下面的类?北京品科艺科技有限公司

    1)NSuserDefault
    2)NSMange Object Context
    3)NSPredict

    21、什么是plist文件?怎么加载?平时怎么用?北京品科艺科技有限公司

    22、怎么从xib文件加载成UIview?北京品科艺科技有限公司

    23、通知与代理的区别?北京品科艺科技有限公司

    24、viewDidload和viewWillApper区别?北京品科艺科技有限公司

    25、UITablewCell。。。。。。didRow。。。。。和UITablewCell。。。。。。willDid。。。。。区别?北京品科艺科技有限公司

    26、流媒体面试?

    今天问的 视频 直播 和 视频切割 播放
    缓存
    视频直播,就是服务器端下载好数据或者有视频镜像做好切片后发送给客户端

    银客网:

    27、OC有没有多继承?没有的话用什么代替?

    28、线程和进程的区别?

    29、多线程有几种方法?各有什么优缺点?

    30、代理、通知、KVO各有什么优缺点?

    康源互动,网信金融点财网的面试题:

    31,OAuth2.0授权的过程,是否用过1.0?

    32,id是编译时还是运行时

    33,蓝牙

    34,自定义实现控制器的切换

    35,runtime

    36,storyboard和xib的区别?

    37,谈谈对iOS和android的看法

    38,fmdb操作表的常用两个方法

    39,fmdb修改数据返回的布尔值是表示这条sql执行成功还是数据修改成功

    40,如何使用支付宝

    41,如何使用分享

    42,io8的新特性

    43、请你用简单的语言描述 客户端的工作的过程

    44、
    在这里插入图片描述

    45、怎么用c++ 实现kvo?

    46、怎么实现在一个线程中同时执行两个任务?答应不可能,挖坑让你跳

    47、collectionView 是ios 6,还是7出现的?

    48、机试:实现一个无线滚动?

    49、iOS中怎么使用二维码?

    50、在公司开发一个项目的具体流程?各部门怎么协作?

    51、你的项目中是否用到了UDP /tcp/socket?

    52、网上的实现过程用到了runtime机制?http://bbs.9ria.com/thread-242558-1-1.html

    53、AFN /SDWebImage/ HDD框架底层怎么实现的?

    54、NSFileManager/NSFileHandle为什么不用文件加载而用数据库?

    55、三维动画的旋转的原理?底层怎么实现?点与点 用距阵变换实现的。

    56、写block c++ 写容器 链表, 数据库 增加?

    57、逻辑运算跟位运算的区别?

    58、用c++实现单例?

    59、你用过github么 ?用来干嘛?

    60、大文件上传服务器,用什么办法?Socket、最好是tcp\ip一段一段读取,读取一段发一段,利用NSFileHandle。

    61、CFNetwork基于啥?

    62、还问了afn和asi基于什么?

    63、uikit基于什么?

    64、coreanimation的上一层和下一层分别是什么?

    65、多线程有几种方式?4种NSThread

    66、http协议?post.get.put等等

    67、默写二分查找算法?

    68、默写block函数?

    69、ios6/ios7导航栏里面的结构有什么变化?

    70、iOS5/6什么时候出来的?

    71、你当时学iOS用得开发工具是几你怎么说?开始学的时候是arc 还是非arc 怎么回答?arc从Xcode几开始有的?ios版本是多少?

    答:iOS5(2011年6月出)开始出现ARC,2011年11月29日 4.3就支持ARC了。2012年6月,苹果公司在WWDC 2012上宣布了iOS 6,提供了超过 200 项新功能。
    2013年6月10日,苹果公司在WWDC 2013上发布了iOS 7,几乎重绘了所有的系统APP,去掉了所有的仿实物化,整体设计风格转为扁平化设计。将于2013年秋正式开放下载更新。[1]
    2013年9月10日,苹果公司在2013秋季新品发布会上正式提供iOS 7下载更新。
    2014年6月3日(太平洋时间2014年6月2日),苹果公司在WWDC 2014上发布了iOS 8,并提供了开发者预览版更新。

    72、字符串通常用copy关键词,但为什么用copy不用strong呢?

    73、delegate为什么需要用weak呢?delegate内部有retain,为了防止循环引用, delegate用strong不能释放 循坏引用

    74、根据什么确定要开启线程数?一般情况下开启几条?

    答:一般不需要管理线程数量,程序开放时是针对队列开发的,向队列添加操作就可以了。具体的线程数量由底层的线程池管理,开启线程的数量一般会根据用户的网络情况决定。WIFI一般5-6条,3G一般2-3条。

    75、设计一个忽略大小写比较两个字符串的算法?

    76、怎么过滤一段既有字符串又有数字的,让他只剩数字?

    77、Sdwebimage的设计思想?多线程下载、内存管理,防止内存溢出。

    解析下xml?

    - (IBAction)loadData
    {
        // 1. URL
        NSURL *url = [NSURL URLWithString:@"http://127.0.0.1/videos.xml"];
        
        // 2. Request
        NSURLRequest *request = [NSURLRequest requestWithURL:url];
        
        // 3. 异步方法
        [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
            
            // XML解析
            // 1> 实例化解析器
            NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
            
            // 2> 设置代理
            parser.delegate = self;
            
            // 3> 解析器开始解析
            [parser parse];
        }];
    }
    

    版本二:

    // 1. 开始文档
    - (void)parserDidStartDocument:(NSXMLParser *)parser
    {
        NSLog(@"开始文档");
        // 初始化准备,清空数组
        [self.videosM removeAllObjects];
    }
    
    // 2. 开始节点
    - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
    {
        NSLog(@"%@ %@", elementName, attributeDict);
        // 如果是video,创建Video对象,准备设置内容,顺便设置videoId
        if ([elementName isEqualToString:@"video"]) {
            // 实例化对象
            self.currentVideo = [[Video alloc] init];
            
            // 设置videoId
            [self.currentVideo setValue:attributeDict[@"videoId"] forKeyPath:@"videoId"];
        }
        
        // 要拼接的字符串清空
        [self.elementM setString:@""];
    }
    
    // 3. 发现节点文本
    - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
    {
        NSLog(@"%@", string);
        // 拼接字符串
        [self.elementM appendString:string];
    }
    
    // 4. 结束节点
    - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
    {
        NSLog(@"结束节点 %@", elementName);
        
        // 如果是/video,第二步实例化的video添加到数组
        if ([elementName isEqualToString:@"video"]) {
            [self.videosM addObject:self.currentVideo];
        }
        else if (![elementName isEqualToString:@"videos"]) {
            [self.currentVideo setValue:self.elementM forKeyPath:elementName];
        }
    
    // 5. 结束文档
    - (void)parserDidEndDocument:(NSXMLParser *)parser
    {
        NSLog(@"结束文档 %@", self.videosM);	
        
        self.dataList = self.videosM;
    }
    
    // 6. 出错
    - (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError
    {
        NSLog(@"%@", parseError.localizedDescription);
    }
    
    解析json数据的demo?
    - (void)loadData
    {
        NSLog(@"JSON 加载……");
        
        // 1. URL
        NSURL *url = [NSURL URLWithString:@"http://192.168.26.3/videos.json"];
        
        // 2. Request
        NSURLRequest *request = [NSURLRequest requestWithURL:url];
        
        // 3. 异步方法
        [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
            
            // 反序列化
            NSArray *array = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL];
            
            [array writeToFile:@"/Users/apple/Desktop/123.plist" atomically:YES];
            
            // 转换成video的数组
            NSMutableArray *arrayM = [NSMutableArray array];
            
            for (NSDictionary *dict in array) {
                [arrayM addObject:[Video videoWithDict:dict]];
            }
            
            // 设置数据
            self.dataList = arrayM;
        }];
    }
    

    自定义cell的时候用到nstimer会有什么问题?

    北京263网络公司:

    1.过滤“hgdghghfgghh12457t367888dhjhd55fhfh”字符串,仅保留数字

    2.delegate用什么修饰?weak assign strong ? 有什么例外?为什么?

    3 self.name = XXX 与 name = XXX有什么区别

    4,常用的多线程的API 除了网络异步 还在哪些情况应用

    5.你在开发中又遇到EXC_BAD_ACCEXX吗?你是怎么处理的

    5,在开发中你有遇到内存不足的警告吗?你是怎么做预处理的?

    7.画出UIViewController的生命周期

    8.从viewA跳转到viewB,有几种方式来实现viewB的值传递

    9.有什么可以改进的?

    NSMutableArray *arr = [[NSMutableArray alloc] init];
       for (int i = 0; i < 1000; i ++) {
            NSString *str = [NSString stringWithFormat:@"%d",i];
           [arr addObject:str];
        }
       NSLog(@"%@",arr);
        [arr release];
       
       
       
        return 0;
    }
    

    10.对于以下代码

    /**
     *  代码A
     */
    void exampleA(NSMutableArray *array){
        char b = 'B';
        [array addObject:^{
            printf("%c\n",b);
        }];
    }
    void testA()
    {
        NSMutableArray *array = [NSMutableArray array];
        exampleA(array);
        void (^block)() = [array objectAtIndex:0];
        block();
    }
    /**
     *  代码B
     */
    void exampleB(NSMutableArray *array){
        [array addObject:^{
            printf("C\n");
        }];
    }
    void testB()
    {
        NSMutableArray *array = [NSMutableArray array];
        exampleA(array);
        void (^block)() = [array objectAtIndex:0];
        block();
    }
    

    //你认为代码A会(B)代码B会()
    // A always works
    //B only works with ARC
    //C,only works with MRC
    //D never works

    11. 如果我的应用想要获得系统的通讯录,怎么样使系统改变的通讯录同步到我的自己额应用上?如何改进系统的通讯录来实现这种同步

    runtime你们在哪里用到了?KVO。程序运行中动态创建一个子类,在子类实现了set方法去监听改变
    KVO底层实现原理?

    12、支付功能。

    13、socket

    14、.Objective-C内存管理有哪几种方式,说说你的看法?

    15、编程:一个由整数(不包括0)长度为N(N>0)构成的数组,请只遍历一次(时间复杂度O(1),不允许开辟额外数组空间),把所有负数放在原数组左边,正数放在原数组右边(负数和正数不要求是有序);并找出正数和负数的分界点的位置?

    16、如何判断字符串是否为纯数字?

    17、性能调优,就问我调优工具。

    展开全文
  • iOS 面试题汇总

    2019-07-17 17:06:21
    1. 简单介绍下NSURLConnection类及+ sendSynchronousRequest:returningResponse:error:与– initWithRequest:delegate:两个方法的区别? 答: NSURLConnection主要用于网络访问,其中+ sendSynchronousRequest:...
  • 一、概述面试,难还是不难?取决于面试者的底蕴(气场+技能)、心态和认知及沟通技巧。面试其实可以理解为一场聊天和谈判,在这过程中有心理、思想上的碰撞和博弈。其实你只需要搞清楚一个逻辑:“面试官为什么会这样问...
  • iOS面试

    2020-05-21 18:08:43
    文章目录1.关于简历[2.iOS面试要求( 20K-60K,总结腾讯,阿里和今日头条等的招聘信息)]...2.iOS面试要求( 20K-60K,总结腾讯,阿里和今日头条等的招聘信息) ...
  • iOS面试必看题

    2020-07-29 14:19:55
    001_尚学堂__iOS面试题_命名规范 002_尚学堂_iOS面试题_strongweakcopy上 003_尚学堂_iOS面试题_strongweakcopy下 004_尚学堂_iOS面试题_可变属性问题 005_尚学堂_iOS面试题_selfsuper 006_...
  • iOS基础面试题(一)

    2016-03-23 18:19:35
    kaikaijia同学私信我,说...iOS面试题系列: iOS面试题(二) iOS面试题(三) iOS面试题(四) 随着iOS平台开发的职位的增加,笔试、面试也越来越有“套路”,这里我总结了一些面试题,多数是Objective-C的基础知识,适
  • 整理的一些iOS面试相关问题,持续更新,敬请关注 2018 iOS面试题大全---全方面剖析面试 1、2018 iOS面试题---UI相关:事件传递,图像显示,性能优化,离屏渲染 2、2018 iOS面试题---Objective_C语言特性相关问题 3...
  • 下面是为各位小伙伴收录的包括 阿里、腾讯、百度、今日头条、美团、滴滴、京东、小米、华为、网易、新浪等各大公司的ios面试题。 分享给各们想换工作的小伙伴们,拿走~ 最新面试题汇总 https://v2ee.cn/ 字节跳动...
  • 比如“2018iOS面试题及答案整理”,“iOS最新面试题整理”,“iOS面试题及答案”等 第一,可以帮你系统的复习相关的基础知识点,查漏补缺。我们平时工作可能聚焦在某个小领域,有些不太相关的基础知识点可能太久没有...
  • iOS面试题经典汇总

    2020-07-21 09:58:45
    iOS面试题经典汇总,包含iOS各个模块内容的介绍。
  • 面向高级开发人员的iOS面试问题当您准备进行技术性iOS面试时,了解您可能会询问哪些主题以及经验丰富的iOS开发人员期望什么是非常重要的。这是许多硅谷公司用来衡量iOS候选人资历水平的一系列问题。这些问题涉及iOS...
  • 史上最全的iOS面试题及答案
  • 持续关注:请叫我Hank,持续输出各大公司iOS面试系列文章,欢迎广大程序猿找我投稿面试中碰到的面试题,我会给你一份我的见解和答案,前面已经分享100道我招聘的面试题,加入下方iOS技术交流群624212887直接获取 ...
  • iOS面试一些常规面试知识点分享,为要跳槽的大神们加分必备.还有一些阿里,腾讯面试题,供参考
  • 62道经典 iOS面试

    2020-05-30 14:57:27
    今年受疫情的影响,各行各业都举步维艰,然而做为iOS面试官的我也在精心准备的为公司招进优秀的iOS开发,期间收到了很多简历,也笔试了不少开发者,上一周我们已经发了3个offer,所以先下手为强,我们已经招满了人的...
1 2 3 4 5 ... 20
收藏数 28,191
精华内容 11,276
关键字:

ios面试