美文网首页
iOS基础知识点(网络摘抄)

iOS基础知识点(网络摘抄)

作者: kidzss | 来源:发表于2016-02-19 15:03 被阅读102次

    1.父类实现深拷贝时,子类如何实现深拷贝。父类没有实现深拷贝时,子类如何实现深拷贝?

          深拷贝同浅拷贝的区别:浅拷贝是指针拷贝,对一个对象进行浅拷贝,相当于对指向对象的指针进行复制,产生一个新的指向这个对象的指针,就是有两个指针指向同一个对象。这个对象销毁后两个指针都应该置空。深拷贝是对一个对象进行拷贝,相当于对对象进行复制,产生一个新的对象,那么就有两个指针分别指向两个对象。当一个对象改变或者被销毁后拷贝出来的新的对象不受影响。

           实现深拷贝需要实现NSCoying协议,实现- (id)copyWithZone:(NSZone *)zone 方法。当对一个property属性含有copy修饰符的时候,在进行赋值操作的时候实际上就是调用这个方法。父类实现深拷贝之后,子类只要重写copyWithZone方法,在方法内部调用父类的copyWithZone方法,之后实现自己的属性的处理。父类没有实现深拷贝,子类除了需要对自己的属性进行处理,还要对父类的属性进行处理。

    2.KVO,NSNotification,delegate及block区别?

           KVO就是cocoa框架实现的观察者模式,一般同KVC搭配使用,通过KVO可以监测一个值的变化,比如View的高度变化。是一对多的关系,一个值的变化会通知所有的观察者。

           KVO一般的使用场景是数据,需求是数据变化,比如股票价格变化,我们一般使用KVO(观察者模式)。delegate一般的使用场景是行为,需求是需要别人帮我做一件事情,比如买卖股票,我们一般使用delegate。

           NSNotification是通知,也是一对多的使用场景。在某些情况下,KVO和NSNotification是一样的,都是状态变化之后告知对方。NSNotification的特点,就是需要被观察者先主动发出通知,然后观察者注册监听后再来进行响应,比KVO多了发送通知的一步,但是其优点是监听不局限于属性的变化,还可以对多种多样的状态变化进行监听,监听范围广,使用也更灵活。

           Notification一般是进行全局通知,比如利好消息一出,通知大家去买入。delegate是强关联,就是委托和代理双方互相知道,你委托别人买股票你就需要知道经纪人,经纪人也不要知道自己的顾客。Notification是弱关联,利好消息发出,你不需要知道是谁发的也可以做出相应的反应,同理发消息的人也不需要知道接收的人也可以正常发出消息。

           delegate 是代理,就是我不想做的事情交给别人做。比如狗需要吃饭,就通过delegate通知主人,主人就会给他做饭、盛饭、倒水,这些操作,这些狗都不需要关心,只需要调用delegate(代理人)就可以了,由其他类完成所需要的操作。所以delegate是一对一关系。

           block是delegate的另一种形式,是函数式编程的一种形式。使用场景跟delegate一样,相比delegate更灵活,而且代理的实现更直观。

    3.将一个函数在主线程执行的4种方法

    1.GCD方法:通过向主线程队列发送一个block块,使block里的方法可以在主线程中执行。

    dispatch_async(dispatch_get_main_queue(), ^{

    //需要执行的方法

    });

    2.NSOperation 方法

    NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];  

    //主队列

    NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{

    //需要执行的方法

    }];

    [mainQueue addOperation:operation];

    3.NSThread 方法

    [self performSelector:@selector(method) onThread:[NSThread mainThread] withObject:nil waitUntilDone:YES modes:nil];

    [self performSelectorOnMainThread:@selector(method) withObject:nil waitUntilDone:YES];

    [[NSThread mainThread] performSelector:@selector(method) withObject:nil];

    4.RunLoop方法

    [[NSRunLoop mainRunLoop] performSelector:@selector(method) withObject:nil];

    4.如何重写类方法?

    1、在子类中实现一个同基类名字一样的静态方法

    2、在调用的时候不要使用类名调用,而是使用[self class]的方式调用。原理,用类名调用是早绑定,在编译期绑定,用[self class]是晚绑定,在运行时决定调用哪个方法。

    5.NSTimer创建后,会在哪个线程运行?

    1.用scheduledTimerWithTimeInterval创建的,在哪个线程创建就会被加入哪个线程的RunLoop中就运行在哪个线程.

    2.自己创建的Timer,加入到哪个线程的RunLoop中就运行在哪个线程。

    6.id 和 NSObject*的区别?

    id是一个 objc_object 结构体指针,定义是 typedef struct objc_object *id.

    id可以理解为指向对象的指针。所有oc的对象 id都可以指向,编译器不会做类型检查,id调用任何存在的方法都不会在编译阶段报错,当然如果这个id指向的对象没有这个方法,该崩溃还是会崩溃的。

    NSObject *指向的必须是NSObject的子类,调用的也只能是NSObjec里面的方法否则就要做强制类型转换。

    不是所有的OC对象都是NSObject的子类,还有一些继承自NSProxy。NSObject *可指向的类型是id的子集。

    7.iOS 核心框架?

    1.CoreAnimation   2.CoreGraphics    3.CoreLocation    4.AVFoundation    5.Foundation

    8.iOS核心机制?

    1.UITableView 重用  

    2.ObjC内存管理;自动释放池,ARC如何实现

    3.runloop

    4.runtime

    5.Block的定义、特性、内存区域、如何实现

    6.Responder Chain

    7.NSOperation

    8.GCD

    9.内存分区情况?

    (1)代码区:存放函数二进制代码

    (2)数据区:系统运行时申请内存并初始化,系统退出时由系统释放。存放全局变量、静态变量、常量

    (3)堆区:通过malloc等函数或new等操作符动态申请得到,需程序员手动申请和释放

    (4)栈区:函数模块内申请,函数结束时由系统自动释放。存放局部变量、函数参数

    10.什么情况使用 weak 关键字,相比 assign 有什么不同?

    1)在ARC中,在有可能出现循环引用的时候,往往要通过让其中一端使用weak来解决,比如:delegate代理属性。

    2)自身已经对它进行一次强引用,没有必要再强引用一次,此时也会使用weak,自定义IBOutlet控件属性一般也使用weak;当然,也可以使用strong。

    不同点:

    1)weak 此特质表明该属性定义了一种“非拥有关系” (nonowning relationship)。为这种属性设置新值时,设置方法既不保留新值,也不释放旧值,此特质同assign类似。 然而在属性所指的对象遭到摧毁时,属性值也会清空(nil out)。 而 assign 的“设置方法”只会执行针对“纯量类型” (scalar type,例如 CGFloat 或 NSlnteger 等)的简单赋值操作。

    2)assigin 可以用非OC对象,而weak必须用于OC对象

    相关文章

      网友评论

          本文标题:iOS基础知识点(网络摘抄)

          本文链接:https://www.haomeiwen.com/subject/wsqvkttx.html