ios中常见问题总结

1. 除了MVC模式 你还熟悉哪些设计模式?
 代理模式:当一个类的某些功能需要有别的类实现 但又不确定具体是哪个类实现的
 单例模式:确保程序运行期间,某个类只有一份实例,用于进行资源共享
 工厂模式:工厂模式创建的实例 多与proxy模式配合 创建可替代的类
观察者模式:一般为model层 对Controller和view进行通知 不关心谁接收 只负责发布消息
策略模式:定义算法 封装起来 使他们之间可以相互替换
2.线程和进程的区别与联系?谈谈多线程
  a 、一个线程只能属于一个进程而一个进程可以有多个线程 至少有一个线程
  b、资源分配给进程,同一进程的所有线程共享该进程的所有资源
 c、处理机分给线程,即真正在处理机上运行的是线程
3.在你的项目开发中,用到了哪些数据存储方式,iOS中常见的方式有哪些?
 (1)归档 (2)nsuserdefault (3)文件操作write 写入 永久保存  (4)sqlite数据库  (5)plist属性列表
4.arc 的程序出现内存泄露怎么办
用ARC 的 只是编译器帮助我们管理了何时去release, retain 不用 ARC 需要自己去管理,说到底就是谁去管理的问题,如果实在找不到问题,建议找到泄露的对象,将其赋值为nil,因为在ARC中 一旦对象没有指针指向 就会马上被释放
5.*简述一下iOS开发流程
(1):产品经理做需求调研,确定产品需求,编写需求文档
(2):产品人员完成产品原型
(3):产品经理召开会议 (产品,UI,开发,测试,服务器)
(4):服务器与客户端成员一起制定接口文档
(5):项目经理制定开发进度,分配任务,预算开发周期
(6):移动客户端开发人员根据UI界面和需求文档 开始编码,开发模块上的功能
(7):开发者提交给测试
(8):测试部分完毕,提交给产品经理,验收产品
(9):提交APPstore
6、iOS主要框架
coreData.framework  :数据库
CoreLocation.framework:定位
MapKit.framework :地图
CoreAnimation.framework:动画
AddressBook.framework :通讯录
AVFoundation.framework:流媒体
CFNetwork.framework:网络通讯(套接字)
Coretelephone.framework:(核心通讯框架)  打电话
CoreText.framework:图文混排
GameKit.framework:  实现蓝牙的相互通信,即是服务端,又是客户端
HealthKit.framework:分离数据处理,数据处理和社会化(苹果主推健康数据处理)
Security.framework:网络安全
Social.framework:社会化分享(新浪,微信,QQ)
OpenAL.framework:播放音频流
MessageUI.framework:发短信,发邮件
NewsstandKit.framework:后台下载,推送

7、简述kvc和kvo之间的关系

    kvc 是一种通过字符串去间接操作对象属性的一种机制,假如,我们去访问一个对象的属性 person.age  也可以用kvc的方式[person valueForKey:@“age”];
    kvo 就是在一个语言框架层面实现观察者模式,通过kvc的方式去修改属性时,会主动通知观察者

8、iOS中frame和bounds的区别
    frame 和bounds 都是UIView的两个属性(property)
    frame 指的是该view在父视图坐标系中的位置和大小(参照点是父坐标系)
    bounds指的是 该view在本身坐标系中的位置和大小(参照点是本身)

9、描述AFNetwork作用和用法
    常见问题:
    1、AFNetWorking作用有哪些?
    (1):AFNetWorking可以将远程媒体数据类型(NSData)转化为可用的格式,比如:json ,xml,图像和plist。
    (2):AFURLConnectionOperation可以让你完成上传和下载,处理和验证,监控上传和下载进度
    (3):AFURLConnectionOperation和它的子类都是继承于NSOperation,允许请求被取消,暂停/恢复和由NSOperationQueue进行管理
    (4):AFHttpClient提供了一个方便的网络交换接口,包括身份验证,是否连接到网络,批量处理操作,查询字符串参数序列化,以及多种表单的请求。
    (5):UIImageView+AFNetworking增加了一个方便方法来异步加载图像
    2、AFNetWorking是否支持缓存?
        可以,NSURLCache以及其子类提供了很多高级的接口,用于处理缓存,如果你想将缓存存储在磁盘,推荐使用SDURLCache

    3、如何使用AFNetWorking上传文件?
    NSData *image = UIImagePNGrepresentation(image) ;
     NSURLRequest *request = [client multipartFromRequestwithMethod:@“POST” path:@“/upload” parameters:nil  ConsTructingBodywithBlock^(id formData) {[formData appendPartWithfileData:imagedata mine Type:@“image/png” name:@“avatar]}];
    4、如何使用AFNetWorking下载一个文件?
    首先创建一个AFURLConnectionOperation对象,然后在对它的属性outputStream进行处理
operation.outputStream = [NSOutputStream outputStreamToFlieAtPath:@“download.zip”append:NO];
    5、当应用程序退出时,如何保持持续的请求?

AFURLConnectionOperation 有一个叫setShouldExecuteAsBackgroundTaskwithExpirationHandle:的方法 用于处理应用程序进入后台,进行持续请求
[self setShouldExecuteAsBackgroundTaskwithExpirationHandle:^{

}];

10、请简述你对strong和weak的关键字的理解

 __weak 和 __strong 会出现在声明中

默认情况下,一个指针都会使用 __strong 属性,表明这是一个强引用。这意味着,只要引用存在,对象就不能被销毁。这是一种所期望的行为:当所有(强)引用都去除时,对象才能被收集和释放。

不过, 有时我们却希望禁用这种行为:一些集合类不应该增加其元素的引用,因为这会引起对象无法释放。在这种情况下,我们需要使用弱引用(不用担心,内置的集合类 就是这么干的),使用 __weak 关键字。NSHashTable 就是一个例子。当被引用的对象消失时,弱引用会自动设置为 nil。Cocoa 的 Notification Center 就是这么一个例子,虽然这已经超出纯 Objective-C 的语言范畴

自己更深理解:
1.(weak与strong)不同的是:当一个对象不再有strong类型的指针指向它的时候,它就会被释放,即使改对象还有_weak类型的指针指向它;

  2.一旦最后一个指向该对象的strong类型的指针离开,这个对象将被释放,如果这个时候还有weak指针指向该对象,则会清除掉所有剩余的weak指针

11、iOS系统中的单例类

UIApplication(应用程序实例)
NSNotificationCenter(消息中心):    
NSFileManager(文件管理):   
NSUserDefaults(应用程序设置):    
NSURLCache(请求缓存):  
NSHTTPCookieStorage(应用程序cookies池):
 
12、xib与storyBoard的区别:

 xib是 用来描述软件界面的文件
如果没有xib 所有的界面都要通过代码手动来创建
有了xib以后,可以在xib中进行可视化开发,然后加载xib文件的时候,系统会自动生成对应的代码来创建界面
与xib类似的还有storyboard文件

xib与storyboard的区别

xib是轻量级的 一般只用来买描述一个界面中的某部分内容(用来描述局部UI界面)
storyboard是重量级的 一般用来描述软件的多个界面 以及不同界面之间的跳转关系
一个工程中,可以有多个xib文件,一个xib文件对应这一个视图类控制器,和多个视图,然而使用storyboard时,一个工程只需要一个主storyboard文件就可以,因此在包含多个视图控制器的情况下,采用storyboard管理比较方便,并且storyboard还可以描述界面之间的导航关系

13、HTTP协议中get和post请求的区别:

 1、post请求 请求地址和参数分离,比get更加安全   get请求的参数 直接暴漏在外面 不安全
 2、get请求一般获取服务器的数据(下载数据/提交参数) 不能上传文件,而post两者都可以
 3、get请求在浏览器中字符串长度最大限制为1024,post 没有限制
 4、post 上传文件 文件大小不能超过4G
 5、get请求 NSURLConnetion 请求下来的数据,NSURLConnection 会做一定的数据缓存,post请求,请求下来的数据NSURLConnection不做数据缓存
14、NSthread线程间是如何实现通信的:
线程间通信常用方法
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;
- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait;
15、iOS常用加密方式:
1、MD5加密  MD5是不可逆的仅仅有加密没有解密使用方式
2、AES加密  
        NSString *encryptedData = [AESCrypt encrypt:userName password:password];//加密
    NSString *message = [AESCrypt decrypt:encryptedData password:password]; //解密

3、BSAE64加密   
    NSString *baseEncodeString = [GTMBase64 encodeBase64String:password];
    NSString *baseDecodeString = [GTMBase64 decodeBase64String:baseEncodeString];

16、xml 和json 两种数据格式各有哪些优势?
[  XML ]
使 用XML作为传输格式的优势:
1. 格式统一, 符合标准
2. 容易与其他系统进行远程交互, 数据共享比较方便
缺点:
1. XML文件格式文件庞大, 格式复杂, 传输占用带宽
2. 服务器端和客户端都需要花费大量代码来解析XML, 不论服务器端和客户端代码变的异常复杂和不容易维护
3. 客户端不同浏览器之间解析XML的方式不一致, 需要重复编写很多代码
4. 服务器端和客户端解析XML花费资源和时间

[ JSON ]
优点:
1. 数据格式比较简单, 易于读写, 格式都是压缩的, 占用带宽小
2. 易于解析这种语言, 客户端JavaScript可以简单的通过eval_r()进行JSON数据的读取
3. 支持多种语言, 包括ActionScript, C, C#, ColdFusion, Java, JavaScript, Perl, PHP, Python, Ruby等语言服务器端语言, 便于服务器端的解析
4. 因为JSON格式能够直接为服务器端代码使用, 大大简化了服务器端和客户端的代码开发量, 但是完成的任务不变, 且易于维护
缺点:
1. 没有XML格式这么推广的深入人心和使用广泛, 没有XML那么通用性
2. JSON格式目前在Web Service中推广还属于初级阶段

JSON 和 XML 优缺点的比较
1.       在可读性方面,JSON和XML的数据可读性基本相同。JSON和XML的可读性可谓不相上下,一边是建议的语法,一边是规范的标签形式,很难分出胜负。
2.       在可扩展性方面,XML天生有很好的扩展性,JSON当然也有,没有什么是XML能扩展,JSON不能的。
3.       在编码难度方面,XML有丰富的编码工具,比如Dom4j、JDom等,JSON也有json.org提供的工具,但是JSON的编码明显比XML容易许多,即使不借助工具也能写出JSON的代码,可是要写好XML就不太容易了。
4.       在解码难度方面,XML的解析得考虑子节点父节点,让人头昏眼花,而JSON的解析难度几乎为0。这一点XML输的真是没话说。
5.       在流行度方面,XML已经被业界广泛的使用,而JSON才刚刚开始,但是在Ajax这个特定的领域,未来的发展一定是XML让位于JSON。到时Ajax应该变成Ajaj(Asynchronous Javascript and JSON)了。
6.       JSON和XML同样拥有丰富的解析手段。
7.       JSON相对于XML来讲,数据的体积小。
8.       JSON与JavaScript的交互更加方便。
9.       JSON对数据的描述性比XML较差。
10.   JSON的速度要远远快于XML。
17、请简述你对同步/异步请求数据的理解?
    1、同步请求可以从网络请求数据,一旦发送同步请求,程序将停止与用户交互,直到服务器返回数据完成,才可以进行下一步操作。
    2、异步请求不会阻塞主线程,而会建立一个新的线程来操作,用户发出异步请求后,依然可以对UI操作程序可以继续运行
18、列举几种进程的同步机制,并比较他们之间的优劣
答案:  原子操作信号量机制    自旋锁    管程,会合,分布式系统 
进程之间通信的途径
答案:共享存储系统消息传递系统管道:以文件系统为基础
进程死锁的原因
答案:资源竞争及进程推进顺序非法
死锁的4个必要条 件
答案:互斥、请求保持、不可剥夺、环路 
死锁的处理
答案:鸵鸟策略、预防策略、避免策略、检测与解除死锁
19、栈和堆的区别
管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制,容易产生memory leak。
分配方式:堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配由alloca函数进行分配,但是栈的动态分配和堆是不同的,他的动态分配是由编译器进行释放,无需我们手工实现。
分配效率:栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。堆则是C/C++函数库提供的,它的机制是很复杂的。
20、c和obj-c如何混用
1)obj-c的编译器处理后缀为m的文件时,可以识别obj-c和c的代码,处理 mm文件可以识别obj-c,c,c++代码,但cpp文件必须只能用c/c++代码,而且cpp文件include的头文件中,也不能出现obj- c的代码,因为cpp只是cpp
2) 在mm文件中混用cpp直接使用即可,所以obj-c混cpp不是问题
3)在cpp中混用obj- c其实就是使用obj-c编写的模块是我们想要的。
如果模块以类实现,那么要按照cpp class的标准写类的定义,头文件中不能出现obj-c的东西,包括#import cocoa的。实现文件中,即类的实现代码中可以使用obj-c的东西,可以import,只是后缀是mm。
如果模块以函数实现,那么头文件要按 c的格式声明函数,实现文件中,c++函数内部可以用obj-c,但后缀还是mm或m。

总结:只要cpp文件和cpp include的文件中不包含obj-c的东西就可以用了,cpp混用obj-c的关键是使用接口,而不能直接使用实现代码,实际上cpp混用的是 obj-c编译后的o文件,这个东西其实是无差别的,所以可以用。obj-c的编译器支持cpp.
21、怎样实现一个单例模式的类,给出思路,不写代码。
•       首先必须创建一个全局实例,通常存放在一个全局变量中,此全局变量设置为nil
•       提供工厂方法对该全局实例进行访问,检查该变量是否为nil,如果nil就创建一个新的实例,最后返回全局实例
•       全局变量的初始化在第一次调用工厂方法时会在+allocWithZone:中进行,所以需要重写该方法,防止通过标准的alloc方式创建新的实例
•       为了防止通过copy方法得到新的实例,需要实现-copyWithZone方法
•       只需在此方法中返回本身对象即可,引用计数也不需要进行改变,因为单例模式下的对象是不允许销毁的,所以也就不用保留
•       因为全局实例不允许释放,所以retain,release,autorelease方法均需重写
22、static关键字的作用:
三个明显作用:
1)在函数体内,一个被声明为静态的变量在这一函数被调用过程中维持其值不变(该变量存放在静态变量区)。
2) 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。
3) 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。

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







转载于:https://my.oschina.net/u/2429432/blog/495151

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值