iOS面试必备-iOS基础知识

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS面试必备-iOS基础知识相关的知识,希望对你有一定的参考价值。

近期为准备找工作面试,在网络上搜集了这些题,以备面试之用。

插一条广告:本人求职,2016级应届毕业生,有开发经验。可独立开发,低薪求职。QQ:895193543

 

1.简述OC中内存管理机制.

答:内存管理机制:使用引用计数管理,分为ARC和MRC,MRC需要程序员自己管理内存,ARC则不需要.但是并不是 所有对象在ARC环境下均不需要管理内存,子线程和循环引用并不是这样.与retain配对使用的是release,retain代表引用计 数+1,release代表引用计数-1,当引用计数减为0时,对象则被系统自动销毁.与alloc配对使用的是dealloc,alloc代表为对象开 辟内存空间,dealloc则代表销毁对象的内存空间.

 

2.readwrite,readonly,assign,retain,copy,nonatomic,atomic,strong,weak的作用?

答:读写属性:readonly和readwrite;  语义属性:assign/retain/copy;   原子性:nonatomic.

    ①.readwrite代表可读,可写,即有setter和getter方法,是默认属性.readonly代表只可读,即只有get方法,因为不会生成setter方法,所以它不可以和copy/retain/assign组合使用.

    ②.weak和assign均是弱引用,assign修饰基本数据类型,weak修饰对象类型.strong和weak用于ARC下(ARC下的代理使用 weak,block块使用copy).strong相当于retain.weak相当于assign;assign/retain/copy这些属性用 于指定set访问器的语义,也就是说,这些属性决定了以何种方式对数据成员赋值.

        assign,直接赋值,引用计数不改变,适用于基本数据类型.

        retain,浅拷贝,使用的是原来的内存空间,只能适用于Objective-C对象类型,而不能适用于Core Foundation对象(retain会增加对象的引用计数,而基本数据和Core Foundation对象都没有引用计数).

        copy:对象的拷贝,新申请一块内存空间,并把原始内容复制到那片空间.新对象的引用计数为1,此属性只对那些遵循了NSCopy协议的对象类型有效.

    ③.nonatomic,非原子性访问,不加同步,是异步操作.默认为atomic,原子操作,atomic是Objc使用的一种线程保护技术,基本上来 讲,是防止在写未完成的时候被另外一个线程读取,造成数据错误,而这种机制是消耗系统内存资源的,所以在移动端,都选择nonatomic.

 

另:内存分为5个区,分别是栈区,堆区,全局区,文字常量区,程序代码区.

栈区:由编译器自动分配释放,不需要管理内存.

堆区:一般有程序员分配释放.

全局区:存放全局变量和静态变量.

文字常量区:存放常量字符串.

程序代码区:存放二进制代码.

 

 

3.类变量的@protected,@private,@public,@package,声明各有什么含义?

@protected 受保护的.本类,子类可见.

@private 私有的,类内可用

@public 公有的,类内,子类,外部均可用

@package 可见度在@protected和@public之间,这个类型最常用于框架类的实例变量.

 

4.线程是什么?进程又是什么?区别和联系.

进程:正在运行的程序,负责程序的内存分配.

线程:线程是进程中一个独立执行的控制单元(路径),一个进程至少包含一条线程,即主线程.

创建线程的目的:开辟一条新的执行路径,运行指定的代码,与主线程的代码实现同时执行.

 

5.对多线程开发的理解,ios中有几种实现多线程的方式.

多线程的使用场景:防止卡顿,可以同时完成多个任务,且不影响主线程,把耗时操作放在子线程中执行,但是会消耗内存.

实现多线程的方式:①.NSThread(内存需要自己管理.触发),②.NSOperationQueue(不再关注线程,当前可执行任务个数queue.maxConcurrentOperationCount)③.GCD

详解三种实现多线程的方式:

GCD:

GCD里面包含了串行队列、并行队列、主队列、全局队列。

Dispatch_queue_t q = dispatch_queue_create(“qqq”,DISPATCH_QUEUE_SERIAL);//创建一个串行队列

Dispatch_sync(q,^{

 

});//开启同步任务

Dispatch_async(q,^{

});//开启异步任务

并行队列:DISPATCH_QUEUE_CONCURRENT

主队列:dispatch_queue_t q = dispatch_get_main_queue();

全局队列:dispatch_queue_t q = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);

NSThread

获取当前线程:NSThread * current = [NSThread currentThread];

获取主线程:NSThread * main = [NSThread mainThread];

使用NSThread创建线程的两种方式:

- (id)initWithTarget:(id)target selector:(SEL)selector object:(id)argument;

+ (void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(id)argument; 

暂停当前线程:

[NSThread sleepForTimeInterval:2];

NSOperationQueue

创建一个操作队列:NSOperationQueue * queue = [[NSOperationQueue alloc]init];

添加NSOperation到NSOperationQueue中:[queue addOperation:operation];

添加一组operation:[queue addOperations:operations waitUntilFinished:NO];

添加一个block形式的operation:[queue addOperationWithBlock:^(){

}];

添加NSOperation的依赖对象:[operation2 addDependency:operation1];

设置队列的最大操作数:[queue setMaxConcurrentOperationCount:1];

等待options完成:[operation waitUntilFinished];

暂停、继续queue:[queue setSuspended:YES] [queue setSuspend:NO]

 

 

6.线程同步和异步的区别?ios中如何实现线程的同步?

同步:任务顺序执行,下一个任务依赖于上一任务的完成.

异步:任务执行顺序不定,一起执行.

实现:设置依赖:NSOpreationQueue  GCD中的串行队列.

 

7.iOS类是否可以多继承,如果没有,怎么实现?

不可以多继承.

可以通过类目,延展,协议实现多继承.

类目:类目也叫分类,英文category,在没有原类.m文件的基础上,给该类添加方法.类目里不能添加实例变量,不 能添加和原始类方法名相同的方法,否则会发生覆盖.一个类可以添加多个类目,类目中的方法可以成为原始类的一部分,和原始类方法级别相同,可以被子类继 承.

延展:Extension,是一种特殊形式的类目,主要是在一个类的.m里面声明与实现.作用:就是给某类添加私有方法或者私有变量.

虽然延展是给一个类定义私有方法,但是OC没有绝对的私有方法,其实还是可以调用的,延展里面声明的变量只能在该类内部 使用,外界访问不了.如果是新建文件建的的某类延展.h文件,则不能添加实例变量,如果括号里没有类目名,则认为延展里面的方法为全都必须实现,如果有, 则可选实现.

类目写的方法必须实现,延展写的方法非必须.

 

8.栈和堆的区别?

栈:内存系统管理(系统开辟,系统释放),先进后出.

堆:内存自己管理(自己开辟,自己释放).先进先出.

 

9.iOS本地数据存储都有几种方式?

①.NSkeyedArchiver:采用归档的形式来保存数据,该数据对象需要遵守NSCoding协议,并且该对象 对应的类必须提供encodeWithCoder:和initWithCoder:方法.前一个方法告诉系统怎么对对象进行编码,而后一个方法则是告诉系 统怎么对对象进行解码.

②.NSUserDefaults:用来保存应用程序设置和属性,用户保存的数据.用户再次打开程序或者开机后这些数据 仍然存在.NSUserDefaults可以存储的数据类型包 括:NSData,NSString,NSNumber,NSDate,NSArray.NSDictionary,其他类型的数据需要先行转换.

③.Write写入方式:永久保存在磁盘中.具体:a.获得文件保存的路径.b.生成该路径下的文件,c,往文件中写入数据.d.从文件中读出数据.

④.SQLite:采用SQLite数据库来存储数据,SQLite作为一种轻量级数据库.具体:a.添加SQLite 相关的库以及头文件,b.使用数据库存数数据:打开数据库,编写数据库语句,执行,关闭数据库.另:写入数据库,字符串可以采用char方式,而从数据库 中取出char类型,当char类型有表示中文字符时,会出现乱码,这是因为数据库默认使用ascII编码方式,所以想要正确从数据库中取出中文,需要使 用NSString来接受从数据库取出的字符串.

⑤.CoreData:原理是对SQLite的封装,开发者不需要接触sql语句,就可以对数据库进行操作.

 

10.ios动态类型和动态绑定

多态:父类指针指向子类对象.

动态类型:只有在运行期,才能确定其真正类型.

动态加载:根据不同的条件,加载不同的资源.32和64位.

 

11.深拷贝和浅拷贝的理解.

深拷贝;拷贝的内容.

浅拷贝:拷贝的指针.

深拷贝如:

NSMutableDictionary  * dic = [@{} mutableCopy];

NSMutableArray  * ary = [@[] mutableCopy];

 

12.怎么实现一个singleton的类.

单例是一种设计模式,对象只有一个.缺点:对象不会被释放,如果创建很多的话会占用很多内存,优点:可以当做工具类使用.

static SortDetailsModelDown * single = nil;

+(SortDetailsModelDown *)shareSortDetailsModelDown{

    @synchronized(self){

        if (!single) {

            single = [[SortDetailsModelDown alloc]init];

        }

    }

    return single;

}

 

 

13.什么是安全释放?

先释放再置空.

 

14.RunLoop是什么?

事件循环,是线程里面的一个组件.主线程的RunLoop是自动开启的.分为:计时源(timer source),事件源(输入源):input source.防止CPU中断(保证程序执行的线程不会被系统终止).

   Runloop提供了一种异步执行代码的机制,并不能并行执行任务,是事件接收和分发机制的一个实现.每一个线程都有其对应的RunLoop,但是默认非主线程的RunLoop是没有运行的,需要为RunLoop添加至少一个事件源,然后run它.

   一般情况下我们是没有必要去启动线程的RunLoop的,除非你在一个单独的线程中需要长时间的检测某个事件.

RunLoop,正如其名所示,是线程进入和被线程用来响应事件以及调用事件处理函数的地方.

input source传递异步事件,通常是来自其他线程和不同程序的消息.

timer source传递同步事件.

当有事件发生时,RunLoop会根据具体的事件类型通知应用程序作出响应.

当没有事件发生时,RunLoop会进入休眠状态,从而到达省电的目的.

当事件再次发生时,RunLoop会被重新唤醒,处理事件.

一般在开发中很少会主动创建RunLoop,而通常会把事件添加到RunLoop中.

 

15.什么是序列化和反序列化,可以用来做什么?如何在OC中实现复杂对象的存储.

序列化和反序列化:归档和反归档,进行本地化,进行数据存储.

CoreData:数据托管.有四种存储方式:xml,sqlite,二进制,内存.

遵循NSCoding协议之后,进行归档即可实现复杂对象的存储.

 

16.写一个标准宏MIN,这个宏输入两个参数并返回较小的一个.

#define MIN(A,B) (A)>(B)?(B):(A)

 

17.iPhone OS 有没有垃圾回收机制,简易阐述一下OC内存管理.

木有.引用计数,ARC和MRC,swift(自动引用计数).

 

18.简述应用程序按HOME键进入后台时的生命周期,以及从后台进入前台时的生命周期.

前者:- (void)applicationWillResignActive:(UIApplication *)application

     - (void)applicationDidEnterBackground:(UIApplication *)application

后者:- (void)applicationWillEnterForeground:(UIApplication *)application

     - (void)applicationDidBecomeActive:(UIApplication *)application

另:

各个程序运行状态时代理的回调:

- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions

告诉代理进程启动但还没进入状态保存

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

告诉代理启动基本完成程序准备开始运行

- (void)applicationWillResignActive:(UIApplication *)application

当应用程序将要入非活动状态执行,在此期间,应用程序不接收消息或事件,比如来电话了

- (void)applicationDidBecomeActive:(UIApplication *)application

当应用程序入活动状态执行,这个刚好跟上面那个方法相反

- (void)applicationDidEnterBackground:(UIApplication *)application

当程序被推送到后台的时候调用。所以要设置后台继续运行,则在这个函数里面设置即可

- (void)applicationWillEnterForeground:(UIApplication *)application

当程序从后台将要重新回到前台时候调用,这个刚好跟上面的那个方法相反。

- (void)applicationWillTerminate:(UIApplication *)application

当程序将要退出是被调用,通常是用来保存数据和一些退出前的清理工作。这个需要要设置UIApplicationExitsOnSuspend的键值。

- (void)applicationDidFinishLaunching:(UIApplication*)application

当程序载入后执行

在上面8个方法对应的方法中键入NSLog打印。

现在启动程序看看执行的顺序:

启动程序

lifeCycle[40428:11303] willFinishLaunchingWithOptions

lifeCycle[40428:11303] didFinishLaunchingWithOptions

lifeCycle[40428:11303] applicationDidBecomeActive

按下home键

lifeCycle[40428:11303] applicationWillResignActive

lifeCycle[40428:11303] applicationDidEnterBackground

双击home键,再打开程序

lifeCycle[40428:11303] applicationWillEnterForeground

lifeCycle[40428:11303] applicationDidBecomeActive

 

 

19.ViewController的 alloc,loadView,viewDidLoad,viewWillAppear,viewDidUnload,dealloc,init分别是在 什么时候调用?在自定义ViewController的时候这几个函数里面应该做什么工作?

alloc:申请内存时调用.

loadView:加载视图时调用.

viewDidLoad;视图已经加载后调用.

viewWillAppear:视图将要出现时调用.

viewDidUnload:视图已经加载但是没有加载出来时调用.

dealloc:销毁该视图时调用.

init;初始化该视图时调用.

 

20.描述应用程序的启动顺序.

a.程序入口main函数创建UIApplication实例和UIApplication代理实例.

b.在UIApplication代理实例中重写启动方法,设置根ViewController

c.在第一ViewController中添加控件,实现应用程序界面.

 

21.为什么很多内置类如UITableViewControl的delegate属性都是assign而不是retain?

防止循环引用.

如:对象A引用了对象B,对象B引用了对象C,对象C引用了对象B,这个时候B的引用计数是2,而C的引用计数是1,当 A不再使用B的时候,就释放了B的所有权,这个时候C还引用对象B,所以B不会释放,引用计数为1,因为B也引用着对象C,B不释放,那么C也就不会被释 放,所以他们的引用计数都为1,并且永远不会被释放,形成了循环引用.

 

22.使用UITableView的时候必须要实现的几种方法?

2个数据源方法.分别是:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;

 

+(id)leftModelWith{

    leftModel * model = [self alloc]init];

    return model;

}

 

23.写一个遍历构造器.

 

 

24.UIImage初始化一张图片有几种方法?简述其特点?

3种,

imageNamed:系统会先检查系统缓存中是否有该名字的image,如果有的话,则直接返回,如果没有,则先加载图像到缓存,然后再返回.

initWithContentsOfFile:系统不会检查缓存,而直接从文件系统中记载并返回.

imageWithCGImage:scale:orientation 当scale= 1的时候图像为原始大小,orientation指定绘制图像的方向.

 

25.person的retainCount值,并解释为什么?

Person * per = [Person alloc]init];

self.person = per;

1或者2.看person是什么类型修饰的.

alloc+1,assign+0,retain+1.

 

26.下面这段代码有何问题?

@implementation Person

- (void)setAge:(int)newAge {

    self.age = newAge;

}

@end

死循环

 

for (int i = 0; i < someLargeNumber; i++) {

    NSString *string = @”Abc”;

    string = [string lowercaseString];

    string = [string stringByAppendingString:@"xyz"];

    NSLog(@“%@”, string);

}

 

什么问题,如何修改

 

加入自动释放池@autoreleasepool{};

for (int i = 0; i < someLargeNumber; i++) {

    @antoreleasepool {

        NSString *string = @”Abc”;

        string = [string lowercaseString];

        string = [string stringByAppendingString:@"xyz"];

        NSLog(@“%@”, string);

    }

}

 

 

28.截取字符串"20 | http://www.baidu.com"中,"|"字符前面和后面的数据,分别输出它们。

["20 | http://www.baidu.com" componentSeparatedByString:@"|"];

 

29.用obj-c 写一个冒泡排序.

NSMutableArray *ary = [@[@"1", @"2", @"3", @"4", @"6", @"5"] mutableCopy];

for (int i = 0; i < ary.count - 1; i++) {

    for (int j = 0; j < ary.count - i - 1; j++) {

        if ([ary[j] integerValue] < [ary[j + 1] integerValue]) {

            [ary exchangeObjectAtIndex:j withObjectAtIndex:j + 1];

        }

    }

}

NSLog(@"%@", ary);

 

 

 

30.简述对UIView.UIWindow和CALayer的理解.

UIWindow是应用的窗口,继承于UIView.

UIView继承于UIResponder,是创建窗口中的一个视图,可以响应交互事件.一个程序只有一个主window,可以有多个window.

CALayer图层,一个view可有多个图层,不可以响应事件.

 

31.写一个完整的代理,包括声明,实现.

代理:遵守协议的对象.

@class MyView;

第一步:指定协议:(协议名:类名+Delegate)

@protocol MyViewDelegate <NSObject>

@required

-(void)changeViewBackgroudColor:(MyView *)view;

@optional

-(void)test;

@end

 

@interface MyView : UIView

第二步:指定代理

@property (nonatomic,assign)id<MyView> delegate;

@end

 

第三步:代理遵循协议.

第四步:代理实现协议里面的必须实现的方法和其他可选方法.

第五步:委托方通知代理开始执行方法.

 

32.分析json.xml的区别,底层如何实现?

Json:键值对.数据小,不复杂.便于解析,有框架支持,适合轻量级传输.作为数据包个数传输的时候效率更高.

xml:标签套内容.xml数据两较大,比较复杂.适合大数据量的传输.xml有丰富的编码工具,比如:Dom4j,JDom.解析方式有两种,一是通过文芳模型解析,另外一种遍历节点.

 

33.ViewController的didReceiveMemoryWarning是在什么时候被调用的?

1.当应用程序的内存使用接近系统的最大内存使用时,应用会向系统发送内存警告,这时候系统会调用方法向所有ViewController发送内存警告.

2.打开系统相机.

3.加载高清图片.

默认操作:把里面没有用的对象进行释放.

 

34.面向对象的三大特征,简单介绍.

封装:代码模块化,方便以后调用.

继承:子类继承父类的所有方法和属性.

多态:父类指针指向子类对象.

 

35.重写一个NSString类型的,retain方式声明name属性的setter和getter方法.

属性的三大特性:语义特性,原子特性,读写特性.

同时重写setter和getter方法,@synchronized name = _name,关联属性和实例变量.

- (void)setName:(NSString *)name{

    if(_name != name){

        [_name retain];

        [_name release];

        _name = name;

    }

}

- (NSString *)name{

    return [[_name retain]autorelease];

}

 

 

36.简述NotificationCenter.KVC,KVO,Delegate?并说明它们之间的区别?

NotificationCenter:消息中心.消息通知.

KVC:利用键-值间接访问类中的某个属性.

[self setValue:@"123" forKeyPath:@"name"];

NSLog(@"%@",[self valueForKeyPath:@"name"]);

KVO:利用键-路径间接访问类中的某个属性,也就是观察者模式(KVO+通知中心).基于KVC和通知中心,观察的是实例变量.

Delegate:用于多个类之间的传值.

 

37.What is lazy loading?

懒加载

 

38.对MVC的理解,好处?

MVC:是一种架构.model:数据处理,view:视图显示,controller:逻辑控制,负责视图和模型之间的通信.

高类聚,低耦合,提高代码的复用性.

 

39.监测键盘的弹出.

通知.

[[NSNotificationCenter defaultCenter]addObserver:self   selector:@selector()  name:UIKeyboardWillShowNotification  object:nil];

 

40.  5个ios,sdk库和第三方库.

系统库:UIKit框架:负责应用程序的图形及事件驱动的关键基础,如:用户界面管理,图形和窗口支持.

       Mapkit框架:地图.

       Message UI框架:电子邮件

       AV Foundation框架:可用于音频播放.

       OpenAL框架:用于播放,可播放高质,高性能的网络音频

       Core Data框架:将数据存储在SQLite数据库.

       Core Media框架:播放视频.

第三方:SDWebImage :简化图片处理

       ShareSDK    分享

       SVProgressHUD   轻量级菊花

       AFNetworkin  方便网络开发

       FreeStreamer  播放音频

 

41.介绍响应者链.

当用户点击屏幕,能够产生响应的对象组成的链.

继承自NSResponder,响应者链能够中断.

 

42.传值方式:

通知,单例,代理,属性,block.

 

43.NSString * test = [[NSData alloc] init],test在编译时和运行时分别是什么类型的对象?

编译时是NSString,运行时是NSData.NSData

 

44.OC中对象的交互是如何实现的?

消息机制.

 

45.给定一个字符串,判断字符串中是否还有png,有就删除.

stringContains

使用@""直接替换实现删除

 

46.目标-动作机制.

Target - action

 

47.什么是沙盒?沙盒里包含哪些文件,如何获取文件路径.

沙盒:程序可操作的磁盘空间,系统为之开辟.

包含了3个文件夹.

1.Documents:存放一些比较重要的文件,但是放入Documents中的文件不能过大.

2.Library :是一个资源库,存储一些不太重要的数据.里面包含了两个子文件夹,Caches文件夹,用于缓存,

           Preferences文件夹,系统偏好设置,用户对应用程序的设置,如密码.perferences路径无法找到,只能通过NSUserDefaults.

如:[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];

 

48.介绍一下XMPP?

基于XML的点对点通讯协议,实现通讯功能.

优点:可以跨平台开发.

缺点:丢包,只能发文字(图片发送发的是链接).

 

49.应用程序如何省电?

获取请求不能过频.优化算法.

 

50.写一个递归方法,计算n的阶乘.

-(NSInteger)digui:(NSInteger)i{

    if (i>0) {

        return i*[self digui:(i-1)];

    }else{

        return 1;

    }

}

[[NSUserDefaults standardUserDefaults]setObject:@([self digui:3]) forKey:@"value"];

 

 

 

51.NSArray 和 NSMutableArray 的区别?多线程下那个更安全.

NSArray: 不可变数组.

NSMutableArray: 可变数组.

多线程下NSArray更安全.

 

52.取出一个数组中的重复元素.

1.放进集

2.遍历删除

3.放进字典作为key,再取出key

 

54.isKindOfClass,isMemberOfClass作用分别是什么?

isKindOfClass是某个类的实例或者子类的实例.

isMemberOfClass是某个类的实例

 

55.请分别写出SEL,id的意思?

SEL:选择器.

id:范类型

OC中的对象就是C语言的指针.

 

56.iPhone上,能被应用程序直接调用的系统程序是什么?

能:相册,相机,通讯录,音乐.

不能:计算器,天气,日历,指南针.

 

57.以.mm为扩展名的文件里,可以包含哪些代码?

C++,C,OC

 

58.说说后台如何运行程序.

在plist配置Application does not run in background设置NO(默认就是NO)的前提下.

添加required background modes,值是App registers for location updates和App plays auto or streams audio/video using AirPlay

 

59.sizeof和strlen的区别和联系?

sizeof:占用空间大小.

strlen:字符串大小.

 

60.sprintf,strcpy,memcpy的功能?使用上要注意哪些地方?

sprintf:将某些类型转换成字符串类型

strcpy:拷贝字符串,会越界,‘/0‘

memcpy:拷贝内存

 

61.写一个函数实现strlen的功能?

int sl(const char *s)

{

    int length = 0;

    while (*s!=‘‘) {

        s++;

        length++;

    }

    return length;

}

 

 

 

62.写一个代码片实现输入一个字符串"20130322152830",输出一个NSDate类型的对象,打印该对象输出2013-03-11 15:28:32

NSString * str = @"20130322152832";

NSDateFormatter * format = [[NSDateFormatter alloc]init];

format.dateFormat = @"yyyyMMddHHmmss";//设置格式

NSLog(@"%@",[[format dateFromString:str] dateByAddingTimeInterval:8*60*60]);

 

63.用变量a写出以下定义

a、一个整型数int a = 10

b、一个指向整型数的指针int *p = 10

c、一个指向指针的指针,它指向的指针是指向一个整型数int **p =10

d、一个有10个整型数的数组 int a[10]

e、一个有10个指针的数组,该指针是指向一个整型数的int *a[10]

f、一个指向有10个整型数数组的指针int *a = {1,2,3,4,5,6,7,8,9,10};

g、一个指向函数的指针,该函数有一个整型参数,并返回一个整型数

int *a(int  b){

    return b;

}

 

64.cocoa和 cocoa touch?

cocoa包含Foundation和AppKit框架,可用于开发Mac OS X系统的应用程序

cocoa touch包含Foundation和UIKit框架,可用于开发iPhone OS 系统的应用程序

Cocoa时Mac OS X的开发环境,cocoa Touch是 Iphone OS的开发环境

 

65.网络从下往上分为几层?

从下往上:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。

IP 协议对应网络层,TCP 协议对应传输层,HTTP 协议对应于应用层。

socket 则是对 TCP/IP协议的封装和应用。也可以说,TCP/IP协议是传输层协议,主要解决数据如何在网络中传输,而 HTTTP 是应用层协议,主要解决

如何包装数据。

 

66.

 

67.多线程的底层实现?

线程:进程中一个特立独行的控制单元(路径)。多线程:一个进程至少有一个线程,即主线程。

①、Mach 是第一个以多线程方式处理任务的系统,因此多线程的底层实现机制就是基于 Mach 的线程。

②、开发中很少用到 Mach 级的线程,因为 Mach级的线程没有提供多线程的基本特征,线程之间是独立的。

④、开发中实现多线程的方案:

NSThread、GCD、NSOperationQueue.NSOperation

 

 

68.线程之间怎么通信?

①.performSelect:onThread:withObject:waitUntilDone:

②.NSMachPort

 

69.网络图片问题中怎么解决一个相同的网络地址重复请求的问题.

利用字典:图片地址为 key, 下载操作为 value.value

 

70.用 NSOperation和 NSOperationQueue处理 A.B.C三个线程,要求执行完 A.B 后才能执行?

//创建队列

NSOperationQueue * queue = [[NSOperationQueue alloc]init];

//创建三个操作

NSOperation * A = [NSBlockOperation blockOperationWithBlock:^{

    NSLog{@"A"};

}];

NSOperation * B = [NSBlockOperation blockOperationWithBlock:^{

    NSLog{@"B"};

}];

NSOperation * C = [NSBlockOperation blockOperationWithBlock:^{

    NSLog{@"C"};

}];

// 添加依赖

[C addDependency:a];

[C addDependency:b];

//执行操作

[queue addOperation:a];

[queue addOperation:b];

[queue addOperation:c];

 

 

71.GCD内部怎么实现的?

①.iOS和 OSX 的核心是 XNU 内核, GCD是基于 XNU 内核实现的(是由苹果电脑发展起来的操作系统内核).

②.GCD 的 API 全部在 libdispatch 库中.

③.GCD 底层实现主要有 Dispatch Queue(管理 block)和 Dispatch Source(处理事件).

 

72.怎么保证多人开发进行内存泄露检查。

使用Analuze进行代码的静态分析,为避免麻烦,多人开发尽量使用ARC.

73、非自动内存管理情况下怎么做单例模式。

创建一个单例对象的静态实例,并初始化为nil。

创建一个类的类工厂方法,当且仅当这个类的实例为nil时生成一个类的实例。

实现NScopying协议,覆盖allocWithZone:方法,确保用户在直接分配对象时,不会产生另一个对象。

覆盖release、autorelease、retain、retainCount方法,确保单例的状态。

 

74、对于类方法(静态方法)默认是autorelease的,所有类方法都会这样吗?

①、系统自带的绝大数类方法返回的对象,都是经过autorelease.

 

75、block在ARC中和MRC中的方法有何区别?需要注意什么?

①.对于没有引用外部变量的Block,无论在ARC还是MRC下,类型都是_NSGlobalBlock_,这种类型的block可以理解为一种全局的block,不需要考虑作用域的问题。同时,对它进行Copy和Retain操作也是无效的。

②.避免循环引用。

根据isa指针,block一共有3种类型的block
_NSConcreteGlobalBlock 全局静态
_NSConcreteStackBlock 保存在栈中,出函数作用域就销毁
_NSConcreteMallocBlock 保存在堆中,retainCount == 0销毁

 

76.什么情况下会发生内存泄露和内存溢出?

当程序在申请内存后,无法释放已经申请的内存空间(例如一个对象或者变量在用完后没有释放,这个对象就一直占用着内存),一次内存泄露可以忽略,但如果泄露过多的话,就会造成内存溢出。

当程序在申请内存时,但存入了更大的数据,出现内存溢出。

 

77.[NSArray arrayWithobject<id>]这个方法添加对象后,需要对这个数组进行释放操作吗?

不需要,这个对象会被放到自动释放池中。

 

78.自动释放池如何实现?

自动释放池以栈的形式实现,当你创建一个新的自动释放池时,它将被添加到栈顶,当一个对象收到发送autorelease消息时,它将添加到当前线程的处于栈顶的自动释放池中,当自动释放池被回收时,它们从栈中被删除并且会给池子里所有对象都做一次release操作。

 

79.KVO内部实现原理?

①.KVO是基于runtime机制实现的。

②.当某个类的对象第一次被观察时,系统就会在运行期动态的创建该类的一个派生类,在这个派生类中重写基类中任何被观察属性的setter方法。

派生类在被重写setter方法中实现了真正的通知机制。(Person->NSKVONotification Person)

 

80.能否把比较耗时的操作放在NSNotificationCenter中。

如果在异步线程发出的通知,那么就可以把耗时操作放到NSNotificationCenter中

如果在主线程发的通知,那么就不可以把耗时操作放到NSNotificationCenter中。

 

81.Foundation对象与Core Foundation对象有何区别?

Foundation对象是OC的,Core Foundation对象是C对象。

数据类型之间的转换:

ARC:_bridge_retained、_bridge_transfer

非ARC:_bridge

 

82、不用第三变量,交换AB的值。

A=A+B

B=A-B

A=A-B

或者

A=A^B

B=A^B

A=A^B

 

83.简单描述下对单例模式设计的理解?

节省内存资源,一个应用就一个对象。

 

84.runtime实现的机制是什么?怎么用,一般用于干嘛。

运行时机制,runtime库里面包含了跟类、成员变量、方法相关的API,比如获取类里面的所有成员变量,为类动态添 加成员变量、动态改变类的方法实现,为类动态添加新的方法等,需要导入<objc/message.h><objc /message.h>

①.runtime,运行时机制,它是一套C语言库。

②.实际上我们编写的所有OC代码,最终都是转换成为了runtime库的东西,比如类转换成了runtime库里面的结构体等数据类型,方法转换成了runtime库里面的C语言函数,平时调方法都是转成了objc_msgSend函数(所以说OC有个消息发送机制)

③、因此,可以说runtime是OC的底层实现,是OC的幕后执行者。

④、有了runtime库,能做什么呢?可以获取类里面的所有成员变量、为类动态的添加成员变量、动态的改变类的方法实现、为类动态添加新的方法等等。

 

85.是否使用Core Text 或者 Core Image ?

Core Text

随意修改文本的样式

图文混排(纯C语言)

Core Image(滤镜处理)

能够调节图片的各种属性(对比度、色温、色差等)

 

86、NSNotification和KVO的区别和用法是什么?什么时候应该使用通知,什么时候应该使用KVO,他们的实现有何区别?如果用protocol和delegate来实现类似的功能可能吗?可能的话有何问题?不可能的话why?

通知比较灵活,一个通知能被多个对象接受,一个对象可以接受多个通知。

代理不交规范,但是代码较多(默认是一对一)

KVO性能不好(底层会产生新的类),只能监听某个对象属性的变化,不推荐使用。

 

87、block内部的实现原理。

Objective-C是对C语言的扩展,block的实现是基于指针和函数指针。

 

88、怎么解决缓存池满的问题?

iOS中不存在缓存池满的情况,通常在对象需要创建时才创建,比如UITableView中一般只会创建刚开始在屏幕中的cell,之后都是从缓存池里取,不会再创建新对象。

 

89、控制器View的生命周期及相关函数是什么?你在开发中是如何使用的?

1、首先判断控制器是否有视图,如果没有就调用loadView方法创建:通过storyBoard或者代码。

2、随后调用viewDidLoad,可以进行下一步的初始化操作,只会被调用一次。

3、在视图显示之前调用viewWillAppear,该函数可以多次调用。

4、视图viewDidAppear

5、在布局变化前后,调用viewWill/DidLayoutSubViews处理相关信息。

 

90、有些图片加载比较慢怎么处理?你是怎么优化程序的性能的?

①、图片下载放在异步线程。

②、图片下载过程使用占位图片。

③、如果图片比较大,可以使用多线程断点下载。

 

91.App需要加载大量数据,给服务器发送请求,但是服务器卡住了怎么办?

设置请求超时,给用户提示请求超时,根据用户操作再次请求。

 

92、SDWebImage具体如何实现?

其实就是沙盒缓存机制,主要由三块组成:内存图片缓存,内存操作缓存,磁盘沙盒缓存。

①、利用NSOperationQueue和NSOperation下载图片,还使用了GCD(解析GIF图片)。

②、利用URL作为key,NSOperation作为value.

③、利用URL作为key,UIImage作为value

 

93、AFNetWorking实现原理。

基于NSURL.采用block的方法处理请求,直接返回的是json、XML数据。AFN直接操作对象是 AFHTTPClient,是一个实现了NSCoding和NSCopying协议的NSObject子类。AFGTTPClient是一个封装了一系列 操作方法的工具类。AFN默认没有封装同步请求,如果开发者需要使用同步请求,需要重写相关的方法 (getPath:parameters:failure),对AFHTTPRequestOperation进行同步处理。

 94、上传APP:http://www.bubuko.com/infodetail-648771.html

 

另外网上摘抄的:

1. Object-c的类可以多重继承么?可以实现多个接口么?Category是什么?重写一个类的方式用继承好还是分类好?为什么?

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

2. #import 跟#include 又什么区别,@class呢, #import<> 跟 #import””又什么区别?

答:#import是Objective-C导入头文件的关键字,#include是C/C++导入头文件的关键字,使用#import头文件会自 动只导入一次,不会重复导入,相当于#include和#pragma once;@class告诉编译器某个类的声明,当执行时,才去查看类的实现文件,可以解决头文件的相互包含;#import<>用来包含系 统的头文件,#import””用来包含用户头文件。

3. 属性readwrite,readonly,assign,retain,copy,nonatomic 各是什么作用,在那种情况下用?

答:

1). readwrite 是可读可写特性;需要生成getter方法和setter方法时

2). readonly 是只读特性 只会生成getter方法 不会生成setter方法 ;不希望属性在类外改变

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

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

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

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

4.写一个setter方法用于完成@property (nonatomic,retain)NSString *name,写一个setter方法用于完成@property(nonatomic,copy)NSString *name

答:

1
2
3
4
5
6
7
8
9
10
11
12
- (void) setName:(NSString*) str
{
[str retain];
[name release];
name = str;
}
- (void)setName:(NSString *)str
{
id t = [str copy];
[name release];
name = t;
}

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

答: 编译时是NSString的类型;运行时是NSData类型的对象

6.常见的object-c的数据类型有那些, 和C的基本数据类型有什么区别?如:NSInteger和int

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

7.id 声明的对象有什么特性?

答:Id 声明的对象具有运行时的特性,即可以指向任意类型的objcetive-c的对象;

8.Objective-C如何对内存管理的,说说你的看法和解决方法?

答:Objective-C的内存管理主要有三种方式ARC(自动内存计数)、手动内存计数、内存池。

1). (Garbage Collection)自动内存计数:这种方式和java类似,在你的程序的执行过程中。始终有一个高人在背后准确地帮你收拾垃圾,你不用考虑它什么时候 开始工作,怎样工作。你只需要明白,我申请了一段内存空间,当我不再使用从而这段内存成为垃圾的时候,我就彻底的把它忘记掉,反正那个高人会帮我收拾垃 圾。遗憾的是,那个高人需要消耗一定的资源,在携带设备里面,资源是紧俏商品所以iPhone不支持这个功能。所以“Garbage Collection”不是本入门指南的范围,对“Garbage Collection”内部机制感兴趣的同学可以参考一些其他的资料,不过说老实话“Garbage Collection”不大适合适初学者研究。

解决: 通过alloc – initial方式创建的, 创建后引用计数+1, 此后每retain一次引用计数+1, 那么在程序中做相应次数的release就好了.

2). (Reference Counted)手动内存计数:就是说,从一段内存被申请之后,就存在一个变量用于保存这段内存被使用的次数,我们暂时把它称为计数器,当计数器变为0的 时候,那么就是释放这段内存的时候。比如说,当在程序A里面一段内存被成功申请完成之后,那么这个计数器就从0变成1(我们把这个过程叫做alloc), 然后程序B也需要使用这个内存,那么计数器就从1变成了2(我们把这个过程叫做retain)。紧接着程序A不再需要这段内存了,那么程序A就把这个计数 器减1(我们把这个过程叫做release);程序B也不再需要这段内存的时候,那么也把计数器减1(这个过程还是release)。当系统(也就是 Foundation)发现这个计数器变 成员了0,那么就会调用内存回收程序把这段内存回收(我们把这个过程叫做dealloc)。顺便提一句,如果没有Foundation,那么维护计数器, 释放内存等等工作需要你手工来完成。

解决:一般是由类的静态方法创建的, 函数名中不会出现alloc或init字样, 如[NSString string]和[NSArray arrayWithObject:], 创建后引用计数+0, 在函数出栈后释放, 即相当于一个栈上的局部变量. 当然也可以通过retain延长对象的生存期.

3). (NSAutoRealeasePool)内存池:可以通过创建和释放内存池控制内存申请和回收的时机.

解决:是由autorelease加入系统内存池, 内存池是可以嵌套的, 每个内存池都需要有一个创建释放对, 就像main函数中写的一样. 使用也很简单, 比如[[[NSString alloc]initialWithFormat:@”Hey you!”] autorelease], 即将一个NSString对象加入到最内层的系统内存池, 当我们释放这个内存池时, 其中的对象都会被释放.

9. 原子(atomic)跟非原子(non-atomic)属性有什么区别?

答:

1). atomic提供多线程安全。是防止在写未完成的时候被另外一个线程读取,造成数据错误

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

10. 看下面的程序,第一个NSLog会输出什么?这时str的retainCount是多少?第二个和第三个呢? 为什么?

1
2
3
4
5
6
7
8
9
10
11
NSMutableArray* ary = [[NSMutableArray array] retain];
NSString *str = [NSString stringWithFormat:@"test"];
[str retain];
[aryaddObject:str];
NSLog(@”%@%d”,str,[str retainCount]);
[str retain];
[str release];
[str release];
NSLog(@”%@%d”,str,[str retainCount]);
[aryremoveAllObjects];
NSLog(@”%@%d”,str,[str retainCount]);

str的retainCount创建+1,retain+1,加入数组自动+1 3

retain+1,release-1,release-1 2

数组删除所有对象,所有数组内的对象自动-1 1

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

答:谁申请,谁释放

遵循Cocoa Touch的使用原则;

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

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

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

12.如何对iOS设备进行性能测试?

答: Profile-> Instruments ->Time Profiler

13. Object C中创建线程的方法是什么?如果在主线程中执行代码,方法是什么?如果想延时执行代码、方法又是什么?

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

14. MVC设计模式是什么? 你还熟悉什么设计模式?

答:

设计模式:并不是一种新技术,而是一种编码经验,使用比如java中的接口,iphone中的协议,继承关系等基本手段,用比较成熟的逻辑去处理某一种类型的事情,总结为所谓设计模式。面向对象编程中,java已经归纳了23种设计模式。

mvc设计模式 :模型,视图,控制器,可以将整个应用程序在思想上分成三大块,对应是的数据的存储或处理,前台的显示,业务逻辑的控制。 Iphone本身的设计思想就是遵循mvc设计模式。其不属于23种设计模式范畴。

代理模式:代理模式给某一个对象提供一个代理对象,并由代理对象控制对源对象的引用.比如一个工厂生产了产品,并不想直

以上是关于iOS面试必备-iOS基础知识的主要内容,如果未能解决你的问题,请参考以下文章

iOS开发各种底层实现--面试必备!

iOS~runtime理解 - (开发面试必备)

iOS开发-面试总结(十五)

iOS开发,重点iOS技术点+面试题整理

面试相关的linux装机必备知识点

面试必备攻略!爆火的《超全Android App性能优化 &网络优化知识技能手册》!