面试题整理二

41.+load和+initialize区别是什么?

Apple的文档很清楚地说明了initialize和load的区别在于:load是只要类所在文件被引用就会被调用,而initialize是在类或者其子类的第一个方法被调用前调用。所以如果类没有被引用进项目,就不会有load调用;但即使类文件被引用进来,但是没有使用,那么initialize也不会被调用。

它们的相同点在于:方法只会被调用一次。

文档也明确阐述了方法调用的顺序:父类(Superclass)的方法优先于子类(Subclass)的方法,类中的方法优先于类别(Category)中的方法

42.怎么样可以使ViewController瘦下来?

面试题整理二_第1张图片

使用MVC模式可以达到帮VC瘦身,可以到到提高复用性和可维护性的效果,同时也会让原本一个整体的业务代码,分散到各个不同的地方。

(此处只需要了解)进过MVC分层的好处:

1、VC代码量骤降,易于维护

可以看到拆分后VC中就仅剩下事件的响应操作了,所有显示相关的东西都被单独抽取出来,所有的网络请求以及数据缓存都被提取到出去了。

2、复用性提高

拆分后如果App需要对UI展示进行大改,那么你的改动基本上都会停留在View模块中,你可以选择在现有的基础上改,也可以选择从写一个。只要业务不变的话,Model和VC模块完全不需要修改。这样改动的范围较小,对开发和测试都比较友好。

43.什么情况下会发生内存泄漏和内存溢出例如程序闪退的原因和处理方法

1>当程序在申请内存后,,无法释放已经申请的内存空间(例如一个对象或者变量使用完成后没有释放,这个对对象一直占用着内存),一次内存泄漏的危害可以忽略,但是内存泄露堆积的后果很严重,无论多少内存,迟早会被占光,内存泄露最终会导致内存溢出

2>当程序申请内存时,没有足够的内存空间供其使用,出现了out of memory;比如申请了一个int,但给他存放了long才能存下的数,就是内存溢出.

44.推送的原理个推和极光(自己去看)

45.把程序自己关掉和程序进入后台,远程推送的区别

1.关掉后不执行任何代码,不能处理事件

2应用程序进入后台状态不久后转入挂起状态。在这种状态下,应用程序不执行任何代码,并有可能在任意时候从内存中删除。只有当用户再次运行此应用,应用才会从挂起状态唤醒,代码得以继续执行

3.或者进入后台时开启多任务状态,保留在内存中,这样就可以执行系统允许的动作

4.远程推送是由远程服务器上的程序发送到APNS,再由APNS把消息推送至设备上的程序,当应用程序收到推送的消息会自动调用特定的方法执行事先写好的代码

46.本地通知和远程推送通知对基本概念和用法

(1)本地通知是由本地应用触发的,它是基于时间行为的一种通知形式,例如闹钟定时、待办事项提醒,又或者一个应用在一段时候后不使用通常会提示用户使用此应用等都是本地通知。创建一个本地通知通常分为以下几个步骤:

1)创建UILocalNotification

2)设置处理通知的时间fireDate

3)配置通知的内容:通知主体、通知声音、图标数字等

4)配置通知传递的自定义数据参数userInfo(这一步可选)

5)调用通知,可以使用scheduleLocalNotification:按计划调度一个通知,也可以使用presentLocalNotificationNow立即调用通知。

(2)远程推送是由应用服务提供商发起的,通过苹果的APNs(Apple Push Notification Server)发送到应用客户端。

进行简单的推送知识介绍:

Provider是指某个iPhone软件的Push服务器,APNS是Apple Push Notification Service的缩写,是苹果的服务器。上图可以分为三个阶段:第一阶段:应用程序把要发送的消息、目的iPhone的标识打包,发给APNS。第二阶段:APNS在自身的已注册Push服务的iPhone列表中,查找有相应标识的iPhone,并把消息发送到iPhone。第三阶段:iPhone把发来的消息传递给相应的应用程序,并且按照设定弹出Push通知

面试题整理二_第2张图片

1、应用程序注册消息推送。

2、iOS从APNS Server获取device token,应用程序接收device token。

3、应用程序将device

token发送给PUSH服务端程序。

4、服务端程序向APNS服务发送消息。

5、APNS服务将消息发送给iPhone应用程序

47.KVC和KVO代理 通知中心block

KVC:(键值编码)是一种简介访问对象实例变量的机制,该机制可以不通过存取方法就可以访问对象的实例变量

KVO:(键值观察)是一种能使得对象获取到其他对象属性变化的通知机制

实现KVO键值观察模式,被观察的对象必须使用KVC键值编码来修改它的实例变量,这样才能被观察着观察到。因此,KVC是KVO的基础或者说KVO的实现是建立在KVC的基础之上的

代理:Delegate与block一般适用于两个对象1对1之间的通信交互,Delegate需要定义协议方法,代理对象实现协议方法,并且需要建立代理关系才可以实现通信。Block更加简洁,

48.KVO内部实现原理?kvo改变了两次相同的值,他还会调用监听他的方法吗?

这是通过Objective-C强大的runtime运行时机制实现的。当你第一次观察某个对象时,runtime会创建一个新的继承被监听类的子类。在这个新的类中,它会重写所有被观察的key,然后将对象的isa指针指向新创建的类。所以对象神奇的变成了新的子类的实例。这些被重写的方法中添加了调用通知观察者的方法的代码。当一个对象的一个属性改变时,会触发setKey方法,但这个方法被重写了,并且在内部添加了发送通知机制。

49.NSNotification和KVO的区别和用法是什么?什么时候应该使用通知,什么时候应该使用KVO,它们的实现上有什么区别吗?如果用protocol和delegate(或者delegate的Array)来实现类似的功能可能吗?如果可能,会有什么潜在的问题?如果不能,为什么?

1.效率肯定是delegate比nsnotification高。

2. delegate方法比notification更加直接,最典型的特征是,delegate方法往往需要关注返回值, 也就是delegate方法的结果。比如-windowShouldClose:,需要关心返回的是yes还是no。所以delegate方法往往包含should这个很传神的词。也就是好比你做我的delegate,我会问你我想关闭窗口你愿意吗?你需要给我一个答案,我根据你的答案来决定如何做下一步。相反的,notification最大的特色就是不关心接受者的态度, 我只管把通告放出来,你接受不接受就是你的事情,同时我也不关心结果。所以notification往往用did这个词汇,比如NSWindowDidResizeNotification,那么nswindow对象放出这个notification后就什么都不管了也不会等待接受者的反应。

简明概要的说明了KVO和NSNotification的区别:

和delegate一样,KVO和NSNotification的作用也是类与类之间的通信,与delegate不同的是1)这两个都是负责发出通知,剩下的事情就不管了,所以没有返回值;2)delegate只是一对一,而这两个可以一对多。这两者也有各自的特点。

1)KVO的使用:

被观察者发出addObserver:forKeyPath:options:context:方法来添加观察者。

然后只要被观察者的keyPath值变化(注意:单纯改变其值不会调用此方法,只有通过getters和setters来改变值才会触发KVO),就会在观察者里调用方法observeValueForKeyPath:ofObject:change:context:

因此观察者需要实现方法observeValueForKeyPath:ofObject:change:context:来对KVO发出的通知做出响应。

这 些代码都只需在观察者里进行实现,被观察者不用添加任何代码,所以谁要监听谁注册,然后对响应进行处理即可,使得观察者与被观察者完全解耦,运用很灵活很简便;但是KVO只能检测类中的属性,并且属性名都是通过NSString来查找,编译器不会帮你检错和补全,纯手敲所以比较容易出错。

2)NSNotification的使用

这里的通知不是由被观察者发出,而是由NSNotificationCenter来统一发出,而不同通知通过唯一的通知标识名notificationName来区分,标识名由发送通知的类来起。

首先被观察者自己在必要的方法A里,通过方法postNotificationName:object:来发出通知notificationName这样发送通知者这边的工作就完成了,每次A被调用,就会发送一次通知notificationName。

然后谁要监听A的变化,就通过[NSNotificationCenter defaultCenter]的方法addObserver:selector:name:object:为观察者注册监听name为notificationName的通知然后每次发出name为notificationName的通知时,注册监听后的观察者就会调用其自己定义的方法notificationSelector来进行响应。

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

50.tableView代理方法 的执行顺序

执行顺序如下:

第一轮:

1、numberOfSectionsInTableView:假如section=2,此函数只执行一次,假如section=0,下面函数不执行,默认为1

2、heightForHeaderInSection,执行两次,此函数执行次数为section数目

3、heightForFooterInSection,函数属性同上,执行两次

4、numberOfRowsInSection,此方法执行一次

5、heightForHeaderInSection,此方法执行了两次,我其实有点困惑为什么这里还要调用这个方法

6、heightForFooterInSection,此方法执行两次,

7、numberOfRowsInSection,执行一次

8、heightForRowAtIndexPath,行高,先执行section=0,对应的row次数

第二轮:

1、numberOfSectionsInTableView,一次

2、heightForHeaderInSection,section次数

3、heightForFooterInSection,section次数

4、numberOfRowsInSection,一次

5、heightForHeaderInSection,执行section次数

6、heightForFooterInSection,执行section次数

7、numberOfRowsInSection,执行一次

8、heightForRowAtIndexPath,行高,先执行一次

9、cellForRowAtIndexPath

10、willDisplayCell

然后8、9、10依次执行直到所有的cell被描画完毕

51.tableView的cell的复用原理

复用机制简单的说意思一行一行的cell都是在复用的,滑动tableview的时候,刚离开视图的cell会被放到复用池中,等下一个cell需要显示时,会先看复用池中有没有cell,如果有的时候,就从复用池中拿出来cell,没有的话就重新创建cell。

52.第三方分享 、 第三方登录(友盟 自个看去)

53.static和const

对于C/C++语言来讲,

const就是只读的意思,只在声明中使用;

static一般有2个作用,规定作用域和存储方式.对于局部变量,static规定其为静态存储方式,每次调用的初始值为上一次调用的值,调用结束后存储空间不释放;

对于全局变量,如果以文件划分作用域的话,此变量只在当前文件可见;对于static函数也是在当前模块内函数可见.

static const应该就是上面两者的合集.

下面分别说明:

全局:

const,只读的全局变量,其值不可修改.

static,规定此全局变量只在当前模块(文件)中可见.

static const,既是只读的,又是只在当前模块中可见的.

文件:

文件指针可当作一个变量来看,与上面所说类似.

函数:

const,返回只读变量的函数.

static,规定此函数只在当前模块可见.

54.SDWebImage的原理

SDWebImage实现原理:

1.首先让占位图先显示。

2.SDWebImageManage交给SDImageCache先从内存中查找是否有图片,会以URL作为数据的索引在内存中查找是否有对应的缓存。

3.如果有缓存,通过代理进行回调展示图片。

4.如果内存缓存中没有找到,生成NSInvocationOperation添加到队列,会通过MD5处理过的key来硬盘中查询是否有图片。

5.如果找到了,就把硬盘中的数据加载到内存中并显示。

6.如果没有找到,会生成一个下载器向远程服务器发出请求开始下载图片。

7.图片下载由NSURLConnection来做,实现相关delegate来判断图片下载中、下载完成和下载失败。

8.下载后的图片会被保存到内存和硬盘。

9.进行界面展示。

55.SDWebImage的最大线程数,可不可以修改?

最大线程数(6)可以修改

55.SDWebImage具体如何实现

SDWebImage内部实现过程

入口setImageWithURL:placeholderImage:options:会先把placeholderImage显示,然后SDWebImageManager根据URL开始处理图片。

进入SDWebImageManager-downloadWithURL:delegate:options:userInfo:,交给SDImageCache从缓存查找图片是否已经下载queryDiskCacheForKey:delegate:userInfo:.

先从内存图片缓存查找是否有图片,如果内存中已经有图片缓存,SDImageCacheDelegate回调imageCache:didFindImage:forKey:userInfo:到SDWebImageManager。

SDWebImageManagerDelegate回调webImageManager:didFinishWithImage:到UIImageView+WebCache等前端展示图片。

如果内存缓存中没有,生成NSInvocationOperation添加到队列开始从硬盘查找图片是否已经缓存。

根据URLKey在硬盘缓存目录下尝试读取图片文件。这一步是在NSOperation进行的操作,所以回主线程进行结果回调notifyDelegate:。

如果上一操作从硬盘读取到了图片,将图片添加到内存缓存中(如果空闲内存过小,会先清空内存缓存)。SDImageCacheDelegate回调imageCache:didFindImage:forKey:userInfo:。进而回调展示图片。

如果从硬盘缓存目录读取不到图片,说明所有缓存都不存在该图片,需要下载图片,回调imageCache:didNotFindImageForKey:userInfo:。

共享或重新生成一个下载器SDWebImageDownloader开始下载图片。

图片下载由NSURLConnection来做,实现相关delegate来判断图片下载中、下载完成和下载失败。

56.ARC和MRC的区别

Objective-c中提供了两种内存管理机制MRC(MannulReference

Counting)和ARC(Automatic Reference Counting),分别提供对内存的手动和自动管理,来满足不同的需求。其实arc内部机制原理也是来源于mrc,arc是在iOS 5/ Mac OS X 10.7开始导入,利用Xcode4.2可以使用该机能。arc的首要目的就是让代码简洁化,编程简单化,开发更顺心应手,减少不必要的小问题小疏忽;顾名思义,自动引用计数管理,关于内存的申请,使用和释放过程都交给系统自动实现,我们可也不用关系里面的过程,但是事实上还是mrc的原理,只是是系统帮我们做了管理;

mrc,手动引用计数器管理,是在我们申请到某一块内存,在使用之后,要手动释放,释放机理涉及到计数器问题,如果未释放内存,会造成内存的浪费,俗称内存泄露,甚至引起很多未知的错误结果,这对程序有威胁很大,但是,何时释放,怎么释放,注意哪些问题,很有讲究,这就是mrc的不便之处,也是苹果推出arc的缘由;

mrc的具体机理,计数器是什么,在程序过程中的变化,在达到什么程度会释放内存,怎么操作;建议查阅相关文档;

mrc,在代码上下形式主要表现为,调用该对象时,要做retain操作,使用完成后要release,最后还要重写dealloc方法,对该类的所有对象做释放,所以在mrc的代码会有autorelease,retain,release等词语,

而arc不允许有这些词汇,应为这些操作都由系统自动完成。

引用计数器

1.和内存管理相关的方法

1)alloc引用计数器自动设为1

2)retain引用计数器+1返回了经过+1以后的当前实例对象

3)release引用计数器-1,并不一定是释放

4)retainCount获取引用计数器的值

5)dealloc当实例对象被销毁之前,系统自动调用。

一定要调[super dealloc]

和内存管理相关的名词

1)僵尸对象:此对象被销毁,不能再使用,不能给它发送任何消息

2)野指针:指向僵尸对象(不可用的内存)的指针,给野指针发送消息将会产生不可控的后果。

3)空指针:没有指向任何对象的指针,给空指针发消息不会产生任何行为

内存管理原则

1.如果你想持有某个对象,就必须负责让做一次retain操作,引用计数器+1.

2.如果你想放弃对某个对象的持有权,就要负责让其做一次release操作,引用计数器-1.

3.谁retain,谁release

57.自动释放池自动释放池什么时候释放

自动释放池(Autorelease pool)是OC的一种内存自动回收机制,可以将一些临时变量通过自动释放池来回收统一释放

在每一个事件周期(event cycle)的开始,系统会自动创建一个自动释放池;在每一个事件周期的结尾,系统会自动销毁这个自动释放池。一般情况下,你可以理解为:当你的代码在持续运行时,自动释放池是不会被销毁的,这段时间内你也可以安全地使用自动释放的对象;当你的代码运行告一段落,开始等待用户输入(或者其它事件)时,自动释放池就会被释放掉,池中的对象都会收到一个release消息,有的可能会因此被销毁。

这是很难确定的时间,如果自动释放池的销毁时间过早,那么程序就很危险,这个恐怕很难满足程序员的要求吧。

自动释放池的缺点:它延缓了对象的释放,在有大量自动释放的对象时,会占用大量内存资源。因此,你需要避免将大量对象自动释放。并且,在以下两种情况下,你需要手动建立并手动销毁掉自动释放池:

1.当你在主线程外开启其它线程时:系统只会在主线程中自动生成并销毁掉自动释放池。

2.当你在短时间内制造了大量自动释放对象时:及时地销毁有助于有效利用设备上有限地内存资源。

58.真机(自己回去看去)

59.pch怎么配置

pch需要提前编译在buildSettings中的搜索框中搜索prefix header将precompile prefix header改为yes并将pch所在的工程的目录和pct的文件名写上

60.AFNetWorking怎么封装(一般不会问)

实现AFNetworking的高封装

//1.将AFNetworking的业务封装到了MyHttpDownLoad类中(.h和.m文件已给出)赋值即可使用

//2.调用方法-(void)testAFNetworking;该方法中的网址是我内网的网址,使用者可以换成自己的JSON请求的网址

//3.最后APPDelegate中还要写一句[[AFNetworkReachabilityManager sharedManager] startMonitoring];监听网络状态APPDelegate里还要设置一下

//监听网络状态,只调用一次

[[AFNetworkReachabilityManager sharedManager] startMonitoring];

#import

@interface MyHttpDownLoad : NSObject

//cb callback回调

+(void) download:(NSString *)urlpathparam:(NSDictionary *)dict finish:( void (^)(NSData *data,NSDictionary *obj,NSError *error))cb;

@end

#import "MyHttpDownLoad.h"

#import "AFNetworking.h"

static BOOL isFirst = NO;

static BOOL canCHeckNetwork = NO;

@implementation MyHttpDownLoad

+(void) download:(NSString *)urlpathparam:(NSDictionary *)dict finish:(void (^)(NSData *,NSDictionary *obj, NSError*))cb{

//1..检查网络连接(苹果公司提供的检查网络的第三方库Reachability)

//AFN在Reachability基础上做了一个自己的网络检查的库,基本上一样

if (isFirst == NO) {

//网络只有在startMonitoring完成后才可以使用检查网络状态

[[AFNetworkReachabilityManager sharedManager] startMonitoring];

[[AFNetworkReachabilityManagersharedManager]setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatusstatus) {

canCHeckNetwork = YES;

}];

isFirst = YES;

}

//只能在监听完善之后才可以调用

BOOL isOK = [[AFNetworkReachabilityManager sharedManager] isReachable];

//BOOL isWifiOK = [[AFNetworkReachabilityManager sharedManager]isReachableViaWiFi];

//BOOL is3GOK = [[AFNetworkReachabilityManagersharedManager]isReachableViaWWAN];

//网络有问题

if(isOK == NO && canCHeckNetwork == YES){

NSError *error = [NSError errorWithDomain:@"网络错位" code:100 userInfo:nil];

cb(nil, nil,error);

return;

}

//2..实现解析

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

manager.responseSerializer = [AFHTTPResponseSerializer serializer];

[manager GET:urlpath parameters:dict success:^(NSURLSessionDataTask*task, id responseObject) {

//成功cb是对方传递过来的对象这里是直接调用

NSDictionary *obj = [NSJSONSerialization JSONObjectWithData:responseObjectoptions:NSJSONReadingMutableContainers error:nil];

cb(responseObject, obj ,nil);

} failure:^(NSURLSessionDataTask *task, NSError *error) {

//失败

cb(nil, nil ,error);

}];

};

@end

//2.调用方式

-(void)testAFNetworking{

NSString *urlPath = @"http://10.0.8.8/sns/my/user_list.php";

NSDictionary *params = @{@"page" : @"10"};

[MyHttpDownLoad download:urlPath param:params finish:^(NSData*data,NSDictionary *obj, NSError *error) {

if (error == nil) {

//obj即为解析后的数据.

NSLog(@"parase my downloadjson is %@",obj);

}else{

UIAlertView *av = [[UIAlertViewalloc]initWithTitle:@"网络状态" message:@"亲 网络不给力"delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];

[av show];

}

}];

}

61.js交互

JavaScriptBriage互相传数据都会重点在于两边都要写数据

62.scrollView  contentOffset

contentInset  contentSize怎么把两张图片合成一张

1.- (UIImage*)addImage:(UIImage*)image1toImage:(UIImage*)image2 {

2.UIGraphicsBeginImageContext(image1.size);

3.

4.// Draw image1

5.[image1drawInRect:CGRectMake(0, 0, image1.size.width, image1.size.height)];

6.

7.// Draw image2

8.[image2drawInRect:CGRectMake(0, 0, image2.size.width, image2.size.height)];

9.

10.UIImage*resultingImage = UIGraphicsGetImageFromCurrentImageContext();

11.

12.UIGraphicsEndImageContext();

13.

14.returnresultingImage;

15.}

63.CALayer和UIVIew的区别

两者最大的区别是,图层不会直接渲染到屏幕上,UIView是iOS系统中界面元素的基础,所有的界面元素都是集成自它。它本身完全是由CoreAnimation来实现的。它真正的绘图部分,是由一个CALayer类来管理。UIVIew本身更像是一个CALayer的管理器。一个UIVIew上可以有n个CALayer,每个layer显示一种东西,增强UIVIew的展现能力。

64.cocoa

pods的命令行

更新:pod update

安装:pod setup

导入库:pod install

65.怎么让一个app长时间不用,怎么自动退出登录?

每个用户都有一个自己的uId当你点击登录成功的时候 后台会返回一个sId和uId每次登录的时候都会 拿上一次后台返回的sid进行请求如果登录成功 后台会返回一个新的sid并且覆盖上一次登录的sid如果发送请求所使用的sid登录不成功证明此app长时间没用sid过期重新登录sid过期没过期是后台写的 时间戳

66.进程和线程的区别?线程锁?列举cocoa中常见对几种多线程的实现,并谈谈多线程安全的几种解决办法及多线程安全怎么控制?

1>一个程序至少要有进程,一个进程至少有一个线程

2>资源分配的最小独立单位。就是一个应用程序在处理机上的一次执行过程,它可以申请和拥有系统资源;进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行分配和调度的一个独立单位

3>进程下的一个分支。是进程的一个实体,是CPU调度和分派的基本单位,它是进程更小的能独立运行的基本单位。线程自己基本上不拥有系统资源。只拥有一点在运行中必不可少的资源(如程序计数器、一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源

1>只在主线程刷新访问UI

2>如果要防止资源抢夺,得用synchronized进行加锁保护

3>如果异步操作要保证线程安全等问题,尽量使用GCD(有些函数默认就是安全的)

67.线程间怎么通信

线程间通信:在1个进程中,线程往往不是孤立存在的,多个线程之间需要经常进行通信

线程间通信的体现

1个线程传递数据给另1个线程

在1个线程中执行完特定任务后,转到另1个线程继续执行任务

线程间通信常用方法

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

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

68.简单说一下APP的启动过程,从main文件开始说起

程序启动分为两类:1.有storyboard 2.没有storyboard

有storyboard情况下:

1.main函数

2.UIApplicationMain

*创建UIApplication对象

*创建UIApplication的delegate对象

3.根据Info.plist获得最主要storyboard的文件名,加载最主要的storyboard(有storyboard)

*创建UIWindow

*创建和设置UIWindow的rootViewController

*显示窗口

没有storyboard情况下:

1.main函数

2.UIApplicationMain

*创建UIApplication对象

*创建UIApplication的delegate对象

3.delegate对象开始处理(监听)系统事件(没有storyboard)

*程序启动完毕的时候,就会调用代理的application:didFinishLaunchingWithOptions:方法

*在application:didFinishLaunchingWithOptions:中创建UIWindow

*创建和设置UIWindow的rootViewController

*显示窗口

69.邓白氏编码,几种证书的区别?

1.个人开发者账号(99美元):可以上架AppStore,不可以打分发包。不需要邓白氏码

2.公司开发者账号(99美元):可以上架AppStore,不可以打分发包,可以添加开发者成员的apple id,使其账号加入公司开发者账号这个组织。需要邓白氏码

3.企业开发者账号(299美元):可以打分发包,不可以上架AppStore。需要邓白氏码

70. frame与bounds的区别?Bounds的大小改变frame改变吗?

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

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

会发生改变

71.UIView的圆角属性设置方法

第一种,添加圆角都是改变clipsToBounds和layer.cornerRadius,这样大约两行代码就可以解决这个问题.但是,这样使用这样的方法会强制Core Animation提前渲染屏幕的离屏绘制,而离屏绘制就会为性能带来负面影响

第二种 贝塞尔曲线

UIImageView*imageView = [[UIImageViewalloc] initWithFrame:CGRectMake(0,0,100,100)];

imageView.center=CGPointMake(200,300);

UIImage*anotherImage = [UIImageimageNamed:@"image"];

UIGraphicsBeginImageContextWithOptions(imageView.bounds.size, NO,1.0);

[[UIBezierPathbezierPathWithRoundedRect:imageView.boundscornerRadius:50] addClip];

[anotherImage drawInRect:imageView.bounds];

imageView.image=UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

[self.viewaddSubview:imageView];

72.

awakeFromNib与viewDidLoad区别

awakeFromNib

当.nib文件被加载的时候,会发送一个awakeFromNib的消息到.nib文件中的每个对象,每个对象都可以定义自己的awakeFromNib函数来响应这个消息,执行一些必要的操作。也就是说通过nib文件创建view对象是执行awakeFromNib。

viewDidLoad

当view对象被加载到内存是就会执行viewDidLoad,所以不管通过nib文件还是代码的方式创建对象都会执行viewDidLoad。

73.LayoutSubviews何时会被调用

当要调整subViews时候,需要重写layoutSubviews方法。

1:初始化init方法时候不会触发。

2:滚动UIScrollView时会触发

3:旋转UIScreen时会触发

4:当改变view的值时候会触发,前提是frame前后值发生了变化

5:当改变UIview的大小时候会触发

74.#import和#include的区别@ class代表什么?

预编译指令

Objective-C:#import

C,C++:#include

#import由gcc编译器支持

在Objective-C中,#import被当成#include指令的改良版本来使用。除此之外,#import确定一个文件只能被导入一次,这使你在递归包含中不会出现问题。

使用哪一个还是由你来决定。一般来说,在导入Objective-C头文件的时候使用#import,包含C头文件时使用#include。比如:

#import

#include

#include

#import比起#include的好处就是不会引起交叉编译

二、@class是用来做类引用的

@class就是告诉编译器有这么一个类,至于类的定义是啥不知道

@class一般用于头文件中需要声明该类的某个实例变量的时候用到,在m文件中还是需要使用#import

75.NSString和NSMutableString的区别

NSString是一个不可变的字符串对象。这不是表示这个对象声明的变量的值不可变,而是表示它初始化以后,你不能改变该变量所分配的内存中的值,但你可以重新分配该变量所处的内存空间。而NSMutableString是可变的,意味着你可以追加它的内存空间,或者修改它所分配的内存空间中的值

76.

socket通信的几个关键步骤

面向连接的socket通信就像与对方打电话,首先需要通过电话建立一个连接,连接建立好之后,彼此才能双向通信。它有几个关键步骤

服务器端通常以守护进程的方式实现:

1:创建守护进程

2:获取或注册服务

3:创建socket并绑定地址

4:开始监听

5:接收客户端连接请求

6:进行数据传输

客户端

1:获取或注册服务

2:创建socket

3:发送连接请求

77.Core Foundation中提供了哪几种操作Socket的方法?

CFNetwork、CFSocket和BSDSocket

78. 31.用id声明的对象有什么特性?

Ø没有*号

Ø动态数据类型

Ø可以指向任何类的对象(设置是nil),而不关心其具体类型

Ø在运行时检查其具体类型

Ø可以对其发送任何(存在的)消息

好好看数据库 内购微信支付 支付宝支付 环信 地图XMPP协议Socket等

你可能感兴趣的:(面试题整理二)