Objective-C基础知识点总结

一、#import 和 #include 的区别,@class代表什么?@class 和 #import 的区别?#import<> 和 #import""的区别

     答:使用上的区别:

           1>、@class 方式一般用在头文件中需要声明该类的某个实例变量的时候用到,在 .m 文件中还需要使用#import;

           2>、使用@class方式由于只需要被引用类的名称就行了,而在实现类中由于要使用被引用类中的实例变量和方法,所以需要使用#import来包含被引用类的头文件。

           作用上的区别:

          #import 会包含引用类的所有信息(内容),包括引用类的变量和方法,而 @class 仅仅是告诉编译器有这么一个类,具体这个类里面有什么信息,则完全不知。

          效率上的区别:@class方式不会出现重复编译的问题

在创建对象、继承的时候,使用#import;如果在使用时,只考虑他是一个类而不考虑其中的成员,则建议使用@class。

#import 和 #include相比起来的好处就是不会引起重复包含。#import是OC导入头文件的关键字,#include是C/C++导入头文件的关键字,使用#import头文件会自动只导入一次,不会重复导入,相当于#include 和 #pragma once。

     #import<>是用来包含系统的头文件;而#import""用来包含用户头文件的。

二、Objective-C 的内存管理方式及过程

  答: 1>、当使用 new,alloc 和 copy 方法创建一个对象的时候,则该对象的保留计数器值为1;当不再使用该对象时,则要负责向该对象发送一条 release 或 autorelease 消息,这样一来,该对象在使用寿命结束时将被销毁;

       2>、当通过任何其他方法获得一个对象时,假设该对象的保留计数器值为1,而且已经被设置为自动释放,此时则不需要在执行任何操作来确保该对象被清理;但如果打算在一段时间内拥有该对象,则需要保留它并确保在操作完成时将其释放掉;

      3>、如果保留了某个对象,则需要最终释放 或 自动释放该对象,必须保持retain 方法 和 releaser 方法的使用次数相等。

三、Objective-C(以下简称OC)有私有方法吗?私有变量呢?

   答:Objective-C 类里面的方法只有两种:静态方法 和 实例方法。按照OO的原则就是一个对象只暴露其有用的东西,如果没有了私有方法,对于一些小范围的代码重用就不那么顺手了。

    在类里面声明一个私有方法:

        @interface Controller:NSObject { NSString *something;}

       +(void)thisIsAStaticMethod;

       -(void)thisIsInstanceMethod;

       @end

       @interface Controller(private)

        -(void)thisIsAPrivateMethod;

       @end

      @private可以用来修饰私有变量

      在OC中,所有实例变量默认都是私有的,所有实例方法默认都是公有的。

四、OC的类可以多重继承吗?可以实现多个接口吗?Category是什么?重写一个类的方式时是使用继承好还是使用分类好?为什么?

    答:OC的类不可以多重继承;可以实现多个接口,通过实现多个接口可以完成C++ 的多重继承;Category是指类别,一般情况使用分类较好,使用Category重写类的方法,仅对本Category有效,不会影响到其它类与原有类的关系。

五、属性readwrite、readonly、assign、retain、copy、nonatomic各是什么作用?在什么情况下使用?

   答:1>.readwrite 是可读可写特性,需要生成 getter 和 setter 方法时使用;

         2>.readonly 是只读特性,只会生成 getter 方法,不会生成 setter 方法;当不希望属性在类外发生改变时使用;

         3>.assign 是赋值特性,setter 方法将传入参数赋值给实例变量;仅在设置变量使用 assign;

         4>.retain 表示持有特性,setter 方法将传入参数先保留,再赋值,传入参数的retainCount 会 +1;

         5>.copy 表示赋值特性,setter方法将传入对象复制一份;当需要完全一份新的变量时使用;

         6>.nonatomic 是非原子操作,决定编译器生成 setter、getter是否是原子操作,atomic 表示多线程安全,一般使用nonatomic。

六、对于语句 NSString *obj = [[NSData alloc] init];obj在编译时 和 运行时分别是什么类型的对象?

     答:编译时是NSString的类型;

          运行时是NSData的类型。

七、常见的OC的数据类型有哪些?和 C 的基本数据类型有什么区别?

     答: OC 的数据类型有NSString、NSNumber、NSArray、NSMutableArray、NSData 等,这些都是class,创建后便是对象;而 C 的基本数据类型 int,只是一定字节的内存空间,用于存放数值;NSInteger 是基本数据类型,并不是NSNumber 的子类,当然也不是NSObject 的子类。NSInteger 是基本数据类型Int 或者 Long 的别名(NSInteger 的定义:typedef long NSInteger),它的区别在于,NSInteger 会根据系统是32位还是64位来决定其本身是int 还是Long。

八、id 声明的对象有什么特性?

   答:id 声明的对象具有运行时的特性,即可以指向任意类型的OC对象。

九、原子操作(atomic) 和 非原子操作(nonatomic) 属性有什么区别?

      答:1>.atomic 提供多线程安全,是防止在写操作未完成的时候被另一个线程读取,造成数据错误;

            2>.nonatomic 在自己管理内存的环境中,解析的访问器保留并自动释放返回的值,如果指定了 nonatomic,那么访问器只是简单的返回这个值。

十、内存管理的原则是什么?按照默认法则,那些关键字生成的对象需要手动释放?在和property结合时怎样有效的避免内存泄露?

(或者答:内存管理的几条原则:自己创建的对象自己持有。非自己创建的对象自己也可以持有。自己持有的对象自己释放。非自己持有的对象无法释放。避免循环引用,retain——release成对出现。在dealloc中最好把指针都置空,避免野指针。)

    答:1>.谁申请,谁释放;

          2>.遵循 Cocoa Touch 的使用原则;

          3>.内存管理主要要避免“过早释放” 和 “内存泄露”,对于“过早释放”需要注意@property设置特性时,一定要用对特性关键字;而对于“内存泄露”,一定要申请了就要负责释放,要细心;

          4>.关键字 alloc 或 new 生成的对象需要手动释放;

           5>.设置正确的property属性,对于retain需要在合适的地方释放。

十一、OC中创建线程的方法?如果在主线程中执行代码,方法是什么?如果要延时执行代码,其方法是什么?

       答:线程的三种创建方法:NSThread、GCD的dispatch方法、子类化的NSOperation,然后将其加入NSOperationQueue;在主线程执行代码的方法是:performSelectorOnMainThread ,如果想要延时执行代码可以使用 :performSelector:onThread:withObject:waitUntilDone:

 

十二、描述iOS SDK中如何实现MVC的开发模式

      答:MVC 是模型、视图、控制器开发模式,对于iOS SDK ,所有的View都是视图层的,它应该独立于模型层,由视图控制层来控制。所有的用户数据都是模型层,它应该独立于视图。所有的ViewController都是控制层,由它负责控制视图,访问模型数据。

十三、浅复制 和 深复制的区别:

     答:浅层复制:只复制指向对象的指针,而不复制引用对象的本身。

          深层复制:复制引用对象本身。

          意思就是说我有一个A对象,复制一份后得到A_copy对象后,对于浅复制来说,A 和 A_copy指向的是同一个内存资源,复制的只不过是一个指针,对象本身资源还是只有一份,如果我们对A_copy执行了什么修改操作,则发现A引用的对象同样被修改,这其实违背了我们复制拷贝的一个思想。而深复制就是指内存中存在了两份独立的对象本身。网上有一哥们用一个通俗的例子比喻了深复制和浅复制:

    浅复制就好比是你的影子,你完蛋,你的影子也完蛋;

    深复制就好比你和你的克隆人,你完蛋,你的克隆人还活着。

十四、类别的作用?继承和类别在实现中有什么区别?

     答:1>.类别Category 可以在不获悉、不改变原来代码的情况下往里面添加新的方法,只能添加,不能删除修改;

           2>.如果类别和原来类中的方法产生名称冲突时,则类别将覆盖原来的方法,因为类别具有更高的优先级。

           3>.类别主要有三个作用:

                 (1)将类的实现分散到多个不同文件或多个不同框架中。

                 (2)创建对私有方法的前向引用

                 (3)向对象添加非正式协议

   继承可以增加、修改或删除方法,并且可以增加属性。

十五、类别和类扩展的区别:

      答:category 和 extension 的不同在于后者可以添加属性。另外后者添加的方法是必须要实现的。

            extension可以认为是一个私有的Category。

十六、KVC 和 KVO:

       答:KVC:键-值编码,是一种间接访问对象的属性使用字符串来标识属性,而不是通过调用存取方法,直接或通过实例变量访问的机制。很多情况下可以简化程序代码。

             KVO:键-值观察机制,它提供了观察某一属性变化的方法,极大地简化了代码。

例如:对于按钮点击变化状态的监控:

           [self addObserver:self  forKeyPath:@"highlighted" options:0 context:nil];

          #pragma mark KVO

           -(void)observerValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void)context {

           if([keyPath idEqualToString:@"highlighted"]) {

           [self setNeedsDisplay];

}

对于系统是根据keypath去取到的相应的值发生改变,理论上来说是和KVC机制的道理是一样的。

     对于kvc机制如何通过key寻找到value:
  “当通过KVC调用对象时,比如:[self valueForKey:@”someKey”]时,程序会自动试图通过几种不同的方式解析这个调用。首先查找对象是否带有 someKey 这个方法,如果没找到,会继续查找对象是否带有someKey这个实例变量(iVar),如果还没有找到,程序会继续试图调用 -(id) valueForUndefinedKey:这个方法。如果这个方法还是没有被实现的话,程序会抛出一个NSUndefinedKeyException异常错误。
  (cocoachina.com注:Key-Value Coding查找方法的时候,不仅仅会查找someKey这个方法,还会查找getsomeKey这个方法,前面加一个get,或者_someKey以及_getsomeKey这几种形式。同时,查找实例变量的时候也会不仅仅查找someKey这个变量,也会查找_someKey这个变量是否存在。)
  设计valueForUndefinedKey:方法的主要目的是当你使用-(id)valueForKey方法从对象中请求值时,对象能够在错误发生前,有最后的机会响应这个请求。这样做有很多好处,下面的两个例子说明了这样做的好处。“
  来至cocoa,这个说法应该挺有道理。
  因为我们知道button却是存在一个highlighted实例变量.因此为何上面我们只是add一个相关的keypath就行了,
  可以按照kvc查找的逻辑理解,就说的过去了。

十七、代理的作用:

     答:代理的目的是改变和传递控制链,允许一个类在某些特定时刻通知到其它类,而不需要获取到那些类的指针,可以减少框架复杂度。另外一点,代理可以理解为java中的回调监听机制的一种类似。

 十八、OC中可修改和不可修改的类型:

     答:可修改不可修改的集合类,简单理解就是可动态添加修改和不可动态添加修改一样。

比如:NSArray 和 NSMutableArray,前者在初始化后的内存控件就是固定不可变的,后者可以添加等,可以动态申请新的内存空间。

十九、OC是动态运行时语言:

      答:多态。主要是将数据类型的确定由编译时推迟到了运行时。

          这个问题其实涉及到两个概念,运行时和多态。简单来说,

           运行时机制使我们直到运行时才决定一个对象的类别,以及调用该类别对象指定方法。

           多态:不同对象以自己的方式响应相同的消息的能力叫做多态,也就是说不同的对象以自己的方式响应了相同的消息。

      因此,也可以说运行时机制是多态的基础。

二十、通知和协议的不同之处:

    答:1.协议有控制链的关系,而通知没有;

           代理是一对一的,但是通知是可以多对多的.

通知:

    通知需要有一个通知中心:NSNotificationCenter,自定义通知的话需要给一个名字,然后监听。

    优点:通知的发送者和接受者都不需要知道对方。可以指定接收通知的具体方法。通知名可以是任何字符串。

    缺点:较键值观察(KVO)需要多点代码,在删掉前必须移除监听者。

协议:

     通过setDelegate来设置代理对象,最典型的例子是常用的TableView.

     优点:支持它的类有详尽和具体信息。

      缺点:该类必须支持委托。某一时间只能有一个委托连接到某一对象。

二十一、多态性:

       答:多态,子类指针可以赋值给父类。这个题目其实可以出到一切面向对象语言中,

            多态性允许每个对象以适合自身的方式去响应共同的消息。
            多态性增强了软件的灵活性和重用性。
二十二、单例:
     1.OC中单例的写法: 
 1 +(instancetype)shareNetWorkTools {
 2 
 3     static NetWorkTools *instance = nil;
 4 
 5     static dispatch_once_t onceToken;
 6 
 7     dispatch_once(&onceToken, ^{
 8 
 9         instance = [[NetWorkTools alloc] init];
10 
11     });
12 
13     
14 
15     return instance;
16 
17 }

       2.Swift中单例的写法:

1 static let tools: SoundTools = { () -> SoundTools in
2         let instance = SoundTools()
3        
4         
5         return instance
6     }()

二十三、响应链: 

响应链:在IOS中,有响应者链对事件进行响应,所有的响应类都是UIResponder的子类,响应者链是一个由不同对象组成的层次结构,其中的每个对象将依次获得响应事件消息的机会。

           响应链的过程:

       当事件发生的时候,响应链首先被发送给第一个响应者(往往是事件发生的视图,也就是用户触摸屏幕的地方)。事件将沿着响应者链一直向下传递,知道被接受并作出处理。一般来说,第一响应这是个视图对象或者其子类,当其被触摸后事件就交由它处理,如果他不处理,时间就会被传递给视图控制器对象UIViewController(如果存在),然后是它的俯视图对象(superview),以此类推知道顶层视图。接下来会沿着顶层视图(top view)到窗口(UIwindow 对象) 再到程序的(UIApplication对象),如果整个过程都没有响应这个事件,则该事件被丢弃,一般情况下,在响应链中只要有对象处理事件,事件就会被传递。

           典型的响应路线图如:

     First  Responser --> The Window -->The Applicationn --> App Delegate

简单地说,通知可以 一对多、一对一、多对一

二十五、AFN 和 ASI

底层实现
1>AFN的底层基于OC NSURLConnection和NSURLSession
2.ASI的底层基于纯C语言的CFNetwork框架
3.ASI的运行性能高于AFN

对服务器返回数据处理
1>ASI没有直接提供对服务器数据处理的方式,直接返回 data\string
2>AFN提供了多种对服务器数据处理的方式
1.JSON
2.XIM
3.其实处理

监听请求的过程
1>AFN提供了success和failure两个Block监听请求过程:(只能监听和失败);
2.succeess : 请求成功后调用
3.failure : 请求失败后调用

2>ASI提供了三套方案,每一套方案都能监听请求的完成的过程(监听请求开始,接收响应头信息,接收到具体数据,接收完毕,请求失败);
1.成为代理,蹲守协议,实现协议中的代理方法
2.成为代理,不遵守协议,自定义代理方法
4设置block

在文件下载和文件上传的使用难易度
1>AFN
1.不容易监听下载进度和上传进度
2.不容易实现断点续传
3.一般只用来下载不大的文件

2>ASI
1.非常容易实现下载和上传
2.非常容易监听下载进度和上传进度
3.非常容易实现断点续传
4下载或大或小文件都行

ASI提供了更多的实用功能
1>控制圈圈要不要在请求过程中转
2>可以轻松地设置请求之间的依赖:每一个请求都市一个个 NSOperation对象
3>可以统一管理所有请求(还专门提供了一个叫做ASNetworkQueue来管理所有请求对象);
暂停/恢复/取消所有的请求
监听整个队列中所有请求的下载进度和上传进度

二十六、frame 和 bounds有什么不同?

      答:frame 指的是:该view在父坐标系统中的位置和大小。(参照点是父亲的坐标系统)

            bounds指的是:该view在本身坐标系统中位置和大小。(参照的是本身坐标系统)

 二十七、方法和选择器的不同:
       答:selector是一个方法名字,method是一个组合体,包含了名字和实现。详情可见apple文档。
 
二十八、OC的垃圾回收机制:
        答:OC2.0有Garbage,但是iOS平台不提供。一般我们了解OC对于内存管理都是手动操作的,但是也有自动释放池。 自动释放池的运行原理是: 当运行循环遇到事件的时候 就会自动创建自动释放池。

 二十九、NSOperation queue?

       答:用来存放 NSOperation 的集合类。

           操作和操作队列,基本可以看成java中的线程和线程池的概念。用于处理iOS多线程开发的问题。

          队列里可以加入很多个NSOperation, 可以把NSOperationQueue看作一个线程池,可往线程池中添加操作(NSOperation)到队列中。线程池中的线程可看作消费者,从队列中取走操作,并执行它。

通过下面的代码设置:
[queue setMaxConcurrentOperationCount:5];
线程池中的线程数,也就是并发操作数。默认情况下是-1,-1表示没有限制,这样会同时运行队列中的全部的操作。

三十、延迟加载

          答:懒汉模式,只在用到的时候才去初始化。也可以理解成延时加载。我觉得最好的例子就是tableView中图片的加载显示。一个延时加载,避免内存过高;一个异步加载,避免线程阻塞。

三十一、如果我们不创建内存池,是否有内存池提供给我们?

           答:界面线程维护着自己的内存池,用户自己创建的数据线程,则需要创建该线程的内存池。

三十二、简便构造方法:

           答:简便构造方法一般有CocoaTouch框架提供,如:NSNumber + numberWithBool:+numberWithChar:+numberWithDouble:+numberWithFloat:+numberWithInt:

       Foundation下大部分类均有简便构造方法,我们可以通过简便构造方法获得系统给我们创建好的对象,并且不需要手动释放。

三十三、如何使用Xcode设计通用应用?

       答:使用MVC模式设计应用,其中Model层完全脱离界面,即在Model层,它是可以运行在任何设备上的,在controller层,根据iPhone与iPad(独有UISplitViewController)的不同特点选择不同的viewController对象。在View层,可根据现实要求来设计,其中,以xib文件设计时,设置其为universal。

三十四、在iPhone应用中如何保存数据?

        答:有以下几种保存机制:

      1.通过web服务,保存在服务器上;

      2.通过NSCoder固化机制,将对象保存在文件中;

      3.通过SQlite 或 CoreData 保存在文件数据库中。 

三十五、MVC是什么?有什么特性?为什么在iPhone上被广泛运用?

      答案:MVC设计模式考虑三种对象:模型对象、视图对象、和控制器对象。模型对象代表 特别的知识和专业技能,它们负责保有应用程序的数据和定义操作数据的逻辑。视图对象知道如何显示应用程序的模型数据,而且可能允许用户对其进行编辑。控制 器对象是应用程序的视图对象和模型对象之间的协调者。

三十六、类变量的@protected ,@private,@public,@package声明各有什么含义?

        答:Objecttive-C对存取权限的设定,也是变量的作用域。

     protected—Methods defined in the class and any subclasses can directly access the instance variables that follow.This is the default case. 该类和所有的子类中的方法可以直接访问这样的变量,这是默认的。

private —Methods defined in the class can directly access the instance variables that follow, but subclasses cannot. 该类中的方法可以访问这样的变量,子类不可以。

public —Methods defined in the class and any other classes or modules can di- rectly access the instance variables that follow. 除了自己和子类中的方法外,也可以被其他类或者其他模块中的方法所访问。开放性最大。

package —For 64-bit images, the instance variable can be accessed anywhere within the image that implements the class. 对于64位图像,这样的成员变量可以在实现这个类的图像中随意访问。

http://blog.csdn.net/zxf529/article/details/1746728

三十七、id声明的对象有什么特性?

     答:id 是个很重要的类型,是个可以指向任何类型的指针域或者可以理解为指向任何未知类型的指针。

三十八、委托是什么?委托的property声明用什么属性?为什么?

      答:1>委托:一个对象保存另一个对象的引用,被引用的对象实现了事先确定的协议,该协议用于将引用对象中的变化通知被引用对象。即:是在实现某个功能的时候,委托第三方来实现。

           2>委托和委托方的property声明属性都是assign 或者 weak而不是retain。

           3>为了避免循环引用造成的内存泄露。

三十九、Cocoa中有虚基类吗?怎么简洁的实现?

      没有,Cocoa框架包含两个核心框架:Foundation 和 Application Kit9(UIKit)框架。在iOS中没有多继承,而虚基类是解决C++中多继承问题而产生的。

通过遵循协议来实现。

四十、自动释放池 个 GC(垃圾回收)有什么区别?iPhone上有GC吗? [pool release] 和 [pool drain] 有什么区别?

        答:iPhone上没有GC。iPhone开发的时候没有垃圾回收机制。在垃圾回收环境中,release是一个空操作。因此,NSAutoreleasePool提供了drain方法,在引用计数环境中,该方法的作用等同于调用release,但在垃圾回收环境中,它会触发垃圾回收(如果上次垃圾回收以来分配的内存大于当前的余值)。因此,在通常情况下,您应该使用drain而不是release来销毁自动释放池。(或者回答:[pool release][pool drain]在引用计数方面没有区别,都是对pool引用计数减一;但是,[pool drain]还对自动释放池里的每个对象进行了release操作。相当于释放了自动释放池中的对象)

四十一、线程与进程的区别和联系?

      答:进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发行。

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

四十二、iOS平台怎么做数据的持久化?coredata 和 sqlite 有无必然联系?coredata是一个关系型数据库吗?

          CoreData:

        答:iOS中可以有四种持久化数据的方式:属性列表、对象归档、SQLite3 和 CoreData。

            1>coredata可以使你以图形界面的方式快速的定义app的数据模型,同时在你的代码中容易获取到它;

            2>coredata提供了基础结构去处理常用的功能,例如保存、恢复、撤销和重做,允许你在app中继续创建新的任务;

             3>在使用coredata时,你不用再安装额外的数据库系统,因为coredata使用内置的sqlite数据库;

             4>coredata将你app的模型层放入到一组定义在内存中的数据对象;

             5>coredata会追踪这些对象的改变,同时可以根据需要作出相反的改变,例如用户执行撤销命令;

             6>当coredata在对你app数据的改变进行保存的时候,coredata会把这些数据归档,并永久性保存。

              sqlite:

              1>在mac os x中sqlite库,它是一个轻量级功能强大的关系数据引擎,也很容易嵌入到应用程序;

              2>可以在多个平台使用,sqlite是一个轻量级的嵌入式sql数据库编程;

              3> 与coredata框架不同的是,sqlite是使用程序式的,sql的主要的API来直接操作数据表。

              CoreData不是一个关系型数据库,也不是关系型数据库管理系统(RDBMS)。虽然CoreData支持SQLite 作为一种存储类型,但它不能使用任意的SQLite数据库。CoreData在使用的过程中自己创建这个数据库。CoreData支持一对多的关系。

四十三、什么是安全释放?

     答:[instance release];

          _instance = nil;

        释放对象的时候,要把指针置空,避免野指针。

四十四、为什么有些4.0独有的OC函数在3.1上运行时会报错,而4.0独有的类在3.1上分配内存时不会报错?分配的结果是什么?

       答:因为4.0独有函数,在3.1SDK中无法通过@selector的方式找到,所以运行时会报错。

             在分配内存期间,并不识别对象的类型,与类的创建机制有关。

四十五、property中属性retain、copy、assgin的含义分别是什么

        答:retain:引用计数 +1;  copy:开辟新的内存区域,原有引用计数不变,新对象引用计数为 1;  assgin:简单的赋值,针对基础数据类型。

四十六、

1.     for(int index = 0; index < 20; index ++){  

2.         NSString *tempStr = @”tempStr”;  

3.         NSLog(tempStr);  

4.         NSNumber *tempNumber = [NSNumber numberWithInt:2];  

5.         NSLog(tempNumber);  

6.     }  

for(int index = 0; index < 20; index ++){

    NSString *tempStr = @”tempStr”;

    NSLog(tempStr);

    NSNumber *tempNumber = [NSNumber numberWithInt:2];

    NSLog(tempNumber);

}

 这段代码有什么问题.?会不会造成内存泄露(多线程)?在内存紧张的设备上做大循环时自动释放池是写在循环内好还是循环外好?为什么?

    答:产生了过多的局部变量。在内存紧张的设备上,做大循环,自动释放池写在循环内比较好,能够及时的处理内存。

四十七、怎样实现一个singleton的类,给出思路

       答:1>定义一个static全局类对象sharedInstance;

             2>如果sharedInstance为nil(空),则alloc init;

             3>重写allocWithZone方法,使得每次调用该类的alloc init方法,都会返回同一个对象。

四十八、序列化(或Acrchiving),可以用来干什么?怎样与copy结合?

        答:序列化,Acrchiving是用来将数据存储到文件中。遵循NSCoding协议。

四十九、NSOperationQueue 和 GCD 的区别与类似的地方?

        答:1>GCD 是纯C语言的API,NSOperationQueue 是在GCD的基础上实现的,是GCD更高一层的抽象, 是基于GCD的OC版封装;

              2>GCD仅仅支持FIFO队列,只可以设置队列的优先级,而NSOperationQueue中的每一个任务都可以被重新设置优先级(setQueuePriority:),从而实现不同操作的执行顺序,调整队列的执行顺序;

              3>GCD不支持异步操作之间的依赖关系设置,而NSOperationQueue可以在Operation间设置依赖关系。如果一个Operation依赖另一个Operation所产生的数据,可以设置一个Operation依赖于另一个Operation来实现,NSOperationQueue可以根据依赖关系,以正确的顺序执行Queue中的Operation;

              4>.NSOperationQueue支持KVO,可以监测operation是否正在执行(isExecuted)、是否结束(isFinished)、是否取消(isCanceld),这就意味着你可以观察任务的状态属性。

              5>NSOperationQueue方便停止队列中的任务(通过 cancelAllOperations 方法,suspended),GCD不方便停止队列中的任务;

              6>GCD的执行速度比NSOperationQueue要快;

              7>NSOperationQueue 可设置最大并发数量(节电),GCD具有 dispatch_once(单例) 和 dispatch_after(延迟执行)功能。

五十、JSON 解析:

        1>SBJSON ; 2>JSONKit; 3>NSJSONSerialization (苹果原生的解析方法)

        XML 解析:

        1> DOM 解析 ; 2> SAX 解析

五十一、线程间的通信方案?

        答:1>GCD

              2>performSelector:onThread:withObject:waitUntilDone:

                  performSelectorOnMainThread:withObject:waitUntilDone:

              3>NSMachPort (可选)

五十二、为什么会出现数据安全问题?资源抢夺有哪些解决办法?

          答:出现数据安全问题:是因为不同的线程同时执行任务,同时访问统一资源。如果异步操作要保证线程安全等问题,尽量使用GCD(有些函数默认就是安全的)

                解决资源抢夺的办法:

                  1>添加互斥锁:@synchronized(xx) {...}

                  2>添加同步锁:NSLock

                  3>dispatch_barrior_async :作用在并行队列中,等待前面两个操作并行操作完成

                  4>dispatch_semaphore_wait :等待信号:等待有线程结束之后会增加一个信号才继续执行。

五十四、Core Animation的使用步骤:

          答:1>使用它需要先添加QuartzCore.framework框架和引入主头文件(iOS7不需要);

               2>初始化一个CAAnimation对象,并设置一些动画相关的属性;

               3>通过调用CALayer的addAnimation:forKey:方法增加CAAnimation对象到CALayer中,这样就能开始执行动画了;

                4>通过调用CALayer的removeAnimationForKey:方法可以停止CALayer中的动画。(默认动画时长 0.25 秒)。

五十五、核心动画的本质:在后台移动图层中的内容,执行完毕后图层本身的位置并没有发生变化。

五十六、iOS 9新特性:

     答:1>iOS 9的界面相比于iOS 8并没有明显的界面,依然采用了扁平化、毛玻璃效果等设计元素;

           2>iOS 9新增了新闻聚合阅读应用News,采用推荐阅读的方式,在上面阅读的资讯越多,推荐越精准,不过该服务目前只在美国、英国和澳大利亚推出,并不会在中国落地;

           3>iOS 9中的苹果地图也得到了增强,部分城市中支持公交导航功能,包括北京、上海、广州、深圳、西安、杭州等中国城市也将支持公交导航功能,在地图资讯的丰富性上也有所增强;

           4>iOS 9还增加了多任务分屏功能,iPad端新加入了一项Split View功能,让你可以在不离开当前app的同时就能利用侧滑操作打开第二个app,两个Apps可以五五对半分屏,或者是三七分屏,两个app能在同一屏幕上同时并行运作。目前该功能只支持iPad Air2;

           5>iOS 9还支持“画中画”功能;

           6>iOS 9还大幅优化了电源管理能力;

           7>iPhone6使用 iOS 9可以让续航提升一小时。值得一提的还是,iOS 9的升级只需要1.4GB的空间,用户不需要在为升级空间不够而懊恼。

五十七、工厂模式:简单工厂模式(simple factory) 是类的创建模式,又叫静态工厂方法模式。简单工厂模式就是由一个工厂类根据传入的参数决定创建哪一种的产品类。

工厂模式有4个角色:

     工厂类角色:是具体产品类角色直接调用者;

     抽象产品角色:接口或抽象类,负责具体产品角色的定义,以及与客户端的交互;

     具体产品角色:被工厂类创建的对象,也是客户端实际操作对象;

     客户端:调用工厂类产生实例,并调用实例的方法进行相应工作。

1>类工厂方法的实现是为了向客户提供方便,他们将分配和初始化合在一个步骤中,返回被创建的对象,并进行自动释放处理。2>工厂方法还可以为初始化过程提供对象的分配信息。3>类工厂方法的另一个目的是使类提供单件实例,虽然init...方法可以确认一个类在每次程序运行过程只存在一个实例,但它需要首先分配一个“生的”实例,然后还必须释放该实例。工厂方法则可以避免为可能没有用的对象盲目分配内存。

五十八、Objective-C的优缺点:

      优点:Cateogies、Posing、动态识别、指标计算、弹性讯息传递、不是一个过渡复杂的 C 衍生语言、Objective-C 与 C++可混编编程。

     缺点:1>不支持援命名空间;

              2>不支持运算符重载;

              3>不支持多重继承;

              4>使用动态运行时类型,所有的方法都是函数调用,所以很多编译时很多优化方法都用不到,性能低劣。

 

 

      

 

转载于:https://www.cnblogs.com/zhufengshibei/p/4989607.html

你可能感兴趣的:(移动开发,数据库,内存管理)