ios笔试题

iOS 笔试题

 

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

可以多重继承,通过实现多个协议的方式。可以实现多个接口。Category是分类。重写一个类的方式,一般用分类比较好。分类可以覆盖原有类的实现,并且不影响原有类和其他类。

2.#import 跟#include又什么区别#import<> 跟 #import""又什么区别?

#import 与 #include 比,多了一层保护,避免了文件的重复引用。相当于 #ifndef **    #define ** #endef

#import<> 是引用系统文件或者库文件。

#import””是引用自定义文件。

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

@protected 默认,保护成员,只有本类和public继承的类中能够使用。

@private 私有成员,只有在本类中能够使用。

@public,公有成员,能够在外部类中使用。

@package, 一个@package实例变量在实现这个类的可执行文件镜像中实际上是@public的,但是在外面就是@private。

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

Id 类型对象是通用对象,具有运行时识别的特性,可以指代任何NSObject 及子类的对象。

5.   MVC是什么?有什么特性?为什么在iPhone上被广泛运用?

MVC是 Model-View-Controller。

Model,模型对象,负责持有应用程序的数据和定义数据的逻辑。

View,视图对象,显示模型数据,并与用户进行交互。

Controller,控制器对象,协调模型对象和视图对象。

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

在编译时,testObject为 NSString 对象。

在运行时,testObject为NSData对象。

7.   什么是安全释放?

[_instance release],_instance = nil;

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

8.   为什么有些4.0独有的objective-c 函数在3.1上运行时会报错.而4.0独有的类在3.1上分配内存时不会报错?分配的结果是什么?

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

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

9.   为什么4.0独有的c函数在3.1的机器上运行不会报错(在没有调用的情况下?)而4.0独有的类名在3.1的机器上一运行就报错?

 

10.  异常exception怎么捕获?不同的CPU结构上开销怎样?C中又什么类似的方法?

 

11.  property中属性retain,copy,assgin的含义分别是什么?有什么区别?将其转换成get/set方法怎么做?有什么注意事项?

   Retain,引用计数+1.

   Copy,开辟新的内存区域,原有引用计数不变,新对象引用计数为1.

   Assign,简单的赋值,针对基础数据类型。

12.  委托是什么?委托的property声明用什么属性?为什么?

委托,是在实现某个功能的时候,委托第三方来实现。

声明为assign,或者 weak。为了避免循环引用。

13.  浅拷贝和深拷贝区别是什么?...

拷贝,指的是拷贝内容。

浅拷贝,指的是拷贝内容,而内容里的数据,则拷贝指针。

而深拷贝,指的是拷贝内容,而内容里的数据,也拷贝内容。

14.  Cocoa中与虚基类的概念么?怎么简洁的实现?

没有虚基类的概念。

是通过遵循协议来实现的。

15.  自动释放池跟GC有什么区别?iPhone上有GC么?[pool release] 和[pool drain]有什么区别?

iPhone上没有垃圾回收机制。

[pool release] [pool drain] 在引用计数方面没有区别。都是对pool引用计数减一。

但是,[pool drain] 还对自动释放池里的每个对象进行了release 操作。相当于,释放了自动释放池中的对象。

16.   

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.     }  

<span style="font-family:幼圆;PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">for(int index = 0; index < 20; index ++){

    NSString *tempStr = @”tempStr”;

    NSLog(tempStr);

    NSNumber *tempNumber = [NSNumber numberWithInt:2];

    NSLog(tempNumber);

}

</span>

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

产生了过多的局部变量。

在内存紧张的设备上,做大循环,自动释放池写在循环内比较好。能够及时的处理内存。

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

内存管理的几条原则:自己创建的对象自己持有。非自己创建的对象自己也可以持有。自己持有的对象自己释放。非自己持有的对象无法释放。

Retain, copy, strong。

避免循环引用。Retain – release 成对出现。

在dealloc 中最好把指针都置空,避免野指针。

18.  在一个对象释放前.如果他被加到了notificationCenter 中.不在notificationcenter中remove这个对象可能会出现什么问题?

会内存访问错误。访问到野指针。

19.  怎样实现一个 singleton的类.给出思路。

定义一个static 全局类对象 sharedInstance.

如果sharedInstance 为nil, 则alloc init.

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

20.  什么是序列化或者Acrchiving,可以用来做什么,怎样与copy结合,原理是什么?.

序列化,Archiving 是用来将数据存储到文件中。

遵循NSCoding协议。

21.  线程是什么? 有哪些注意事项.?

线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。

注意事项:数据安全,CPU开销。

22.  在iphone上有两件事情要做,请问是在一个线程里按顺序做效率高还是两个线程里做效率高?为什么?

具体问题具体分析。

如果事情有先后顺序,则按顺序做好。如果有并发的需求,则开辟两个线程效率更高些。

23.  runloop是什么?在主线程中的某个函数里调用了异步函数,怎么样block当前线程,且还能响应当前线程的timer事件,touch事件等.

runLoop 是事件循环队列。

在主线程中调用异步函数,阻塞当前线程。

24.  ios平台怎么做数据的持久化?coredata和sqlite有无必然联系?coredata是一个关系型数据库吗?

iOS的数据持久化,可以有四种方式,属性列表,对象归档,SQLite和CoreData。

属性列表,比如xml,plist。

对象归档,需要遵循NSCoding协议。

SQLite,轻量级的嵌入式sql数据库编程。

CoreData可以以图形界面的方式快速地定义app的数据模型,同时在你的代码中容易获取到它。CoreData内置了SQLite数据库,将app的模型放入到一组定义在内存中的数据对象。CoreData会跟踪这些对象的变化,同时可以根据需要做逆向操作,比如撤销,回滚。当CoreData在对数据的改变进行保存时,CoreData会把数据归档,并永久性保存。

SQLite与CoreData框架不同的是,SQLite使用的是程序式的,SQL是主要通过API来直接操作数据表。

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

25.  阐述一个nil对象从interface bulider产生,到载入程序运行空间,最后被释放时所经历的生命周期.

loadView (或通过xib)加载视图à viewDidLoad à viewWillAppear à viewDidAppear à viewWillDisappear à viewDidDisappear à didReceiveMemoryWarning

viewWillUnLoad viewDidUnload 已经被废弃,取而代之的是didReceiveMemoryWarning。当内存不足时,释放一些视图。

26.  notification是同步还是异步? kvo是同步还是异步?notification是全进程空间的通知吗?kvo呢?

Notification 是同步,会阻塞主线程。不是全进程空间的通知。

27.  kvc是什么?kvo是什么?有什么特性?

KVO 是Key-Value-Observer。

能够通过观察某个属性值的变化,做相应的处理。

28.响应者链是什么?

响应者对象,指的是有响应和处理事件能力的对象。响应者链就是由一系列的响应者对象构成的一个层次结构。

UIResponder就是所有响应对象的基类。

如果当前是控制器的View,则下一个响应者是控制器。

如果当前不是控制器上的View,则下一个响应者是父视图。

响应者链是这样的,当点击或者触摸界面时,界面会捕捉到用户的动作。最先相应的是,被触摸的视图View,若此View为控制器上的View,则将此动作直接传递给控制器,若不是,则传递给父视图,再一层一层传递给控制器。

控制器得到消息后,再传递给Window,最终传递给Application。

消息分发正好是响应者链的逆向顺序。

29.unix上进程怎么通信?

30.timer的间隔周期准吗?为什么?怎样实现一个精准的timer?

不准。因为timer只有在RunLoop的一次循环中被检查发现到之后,才进行调用。

如果上次循环中做了耗时的操作,则timer的执行就会被延后。

精准的Timer

IOS中可以使用"mach_absolute_time"获取到CPU的tickcount的计数值,可以通过"mach_timebase_info"函数获取到纳秒级的精确度代码如下: uint64t start = 0; uint64t end = 0; uint64_t elapsed = 0;

mach_timebase_info_t timeBaseInfo = mach_timebase_info(info);

start = mach_absolute_time();

 

// dosomething

// .....

 

end = mach_absolute_time();

elapsed = end - start;

 

// convert to nanoseconds

uint64_t elapsedNanoSeconds = elapsed * sTimebaseInfo.numer / sTimebaseInfo.denom;


35.以下每行代码执行后,person对象的retain count分别是多少

Person *person = [[Person alloc] init];   // count 1

[person retain];   // count 2

[person release];   //count 1

[person release];   //retain count = 1;


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值