iOS基础面试题汇总

跳转:iOS面试题总结html

[TOC]java


1. #import 跟#include、@class有什么区别?#import<> 跟 #import""又什么区别?

  • 均可以完整包含某个文件的内容,可是#import能防止一个文件被包含屡次
  • @class仅仅是声明一个类名,并不会包含类的完整声明;@class还能解决循环包含的问题
  • #import<> 用来包含系统自带的文件,#import""用来包含自定义的文件

2. 属性readwrite,readonly,assign,retain,copy,nonatomic 各是什么做用,在那种状况下用?

  • readwrite:同时生成get方法和set方法的声明和实现
  • readonly:只生成get方法的声明和实现
  • assign:set方法的实现是直接赋值,用于基本数据类型
  • retain:set方法的实现是release旧值,retain新值,用于OC对象类型
  • copy:set方法的实现是release旧值,copy新值,用于NSString、block等类型
  • nonatomic:非原子性,set方法的实现不加锁(比atomic性能高)

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

- (void)setName:(NSString *)name {
if (_name != name) {
[_name release];
_name = [name retain];
}
}
- (void)setName:(NSString *)name {
if (_name != name) {
[_name release];
_name = [name copy];
}
}

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

  • 编译时是NSString类型ios

  • 运行时是NSData类型面试

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

  • 经常使用OC类型:NSString、NSArray、NSDictionary、NSData、NSNumber等
  • OC对象须要手动管理内存,C的基本数据类型不须要管理内存

6. id 声明的变量有什么特性?

  • id声明的变量能指向任何OC对象

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

  • 每一个对象都有一个引用计数器,每一个新对象的计数器是1,当对象的计数器减为0时,就会被销毁objective-c

  • 经过retain可让对象的计数器+一、release可让对象的计数器-1数据库

  • 还能够经过autorelease pool管理内存数组

  • 若是用ARC,编译器会自动生成管理内存的代码xcode

8. 内存管理的几条原则时什么?按照默认法则,哪些方法生成的对象须要手动释放?在和property结合的时候怎样有效的避免内存泄露?

  • 只要调用了alloc、copy、new方法产生了一个新对象,都必须在最后调用一次release或者autorelease缓存

  • 只要调用了retain,都必须在最后调用一次release或者autorelease网络

  • @property若是用了copy或者retian,就须要对再也不使用的属性作一次release操做

  • 若是用了ARC,另外讨论

9. 看下面的程序,三次NSLog会输出什么?为何?

NSMutableArray *ary = [[NSMutableArray array] retain];
NSString *str = [NSString stringWithFormat:@"test"];  // 1
[str retain];   // 2
[ary addObject:str]; // 3
NSLog(@"%zd", [str retainCount]);
[str retain];  // 4
[str release];   // 3
[str release];   // 2
NSLog(@"%zd", [str retainCount]);
[ary removeAllObjects]; // 1
NSLog(@"%zd", [str retainCount]);
// 结果:三、二、1 注意:retainCount方法并不可靠,可能返回-1

10. OC中建立线程的方法是什么?若是指定在主线程中执行代码?如何延时执行代码?

  • 建立线程的方法
  • NSThread
  • NSOperationQueue和NSOperation
  • GCD
  • 主线程中执行代码
  • [self performSelectorOnMainThread: withObject: waitUntilDone:];
  • [self performSelector: onThread:[NSThread mainThread] withObject: waitUntilDone:];
  • dispatch_async(dispatch_get_main_queue(), ^);
  • 延时执行
  • dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^);
  • [self performSelector: withObject: afterDelay:];
  • [NSTimer scheduledTimerWithTimeInterval: target: selector: userInfo: repeats:];

11. Difference between shallow copy and deep copy?

  • 浅拷贝:指针(地址)拷贝,不会产生新对象(浅拷贝,指针拷贝,shallow copy)

  • 源对象和副本对象是同一个对象

  • 源对象(副本对象)引用计数器+1,至关于作一次retain操做

  • 本质是:没有产生新的对象

NSString *sourceString = @"Just test";
NSString *copyString = [sourceString copy];
NSLog(@"sourceString = %p, copyString = %p", sourceString, copyString);
// sourceString = 0x100001030, copyString = 0x100001030
  • 深拷贝:内容拷贝,会产生新对象(深拷贝,内容拷贝,deep copy)

  • 源对象和副本对象是不一样的两个对象

  • 源对象引用计数器不变,副本对象计数器为1(由于是新产生的)

  • 本质是:产生了新的对象

// 源对象不可变 副本可变
NSString *sourceString = @"Just test";
NSMutableString *copyString = [sourceString mutableCopy];
NSLog(@"sourceString = %p, copyString = %p", sourceString, copyString);
// sourceString = 0x100001030, copyString = 0x10070f470 地址不同

// 源对象可变 副本不可变
NSMutableString *sourceString = [NSMutableString stringWithFormat:@"Just test"];
NSString *copyString = [sourceString copy];
NSLog(@"sourceString = %p, copyString = %p", sourceString, copyString);
// sourceString = 0x100570760, copyString = 0x8d814c14f8d9da09 地址不同

// 源对象不可变 副本不可变
NSMutableString *sourceString = [NSMutableString stringWithFormat:@"Just test"];
NSMutableString *copyString = [sourceString mutableCopy];
NSLog(@"sourceString = %p, copyString = %p", sourceString, copyString);
// sourceString = 0x100634aa0, copyString = 0x100603da0 地址不同
  • 只有源对象和副本对象都不可变时,才是 shallow copy ,其它都是 deep copy

补充

  • 如何使用copy功能
    • 一个对象能够调用copy或mutableCopy方法来建立一个副本对象
    • copy : 建立的是不可变副本(如NSString、NSArray、NSDictionary)
    • mutableCopy :建立的是可变副本(如NSMutableString、NSMutableArray、NSMutableDictionary)
  • 使用copy功能的前提
    • copy : 须要遵照NSCopying协议,实现copyWithZone:方法
@protocol NSCopying
- (id)copyWithZone:(NSZone *)zone;
@end
  • 使用mutableCopy的前提
    • 须要遵照NSMutableCopying协议,实现mutableCopyWithZone:方法
@protocol NSMutableCopying
- (id)mutableCopyWithZone:(NSZone *)zone;
@end

12. What is advantage of categories? What is difference between implementing a category and inheritance?

  • 分类能够在不修改原来类模型的基础上拓充方法
  • 分类只能扩充方法、不能扩充成员变量;继承能够扩充方法和成员变量
  • 继承会产生新的类

13. Difference between categories and extensions?


  • 分类是有名称的,类扩展没有名称
  • 分类只能扩充方法、不能扩充成员变量;类扩展能够扩充方法和成员变量
  • 类扩展通常就写在.m文件中,用来扩充私有的方法和成员变量(属性)

14. Difference between protocol in Objective-C and interfaces in Java?


  • Java的接口中声明的方法必须都实现
  • Objective-C 的protocol中声明的方法并不必定要实现

15. What are KVO and KVC?

  • KVC是键值编码,能够经过一个字符串的key(属性名)修改对象的属性值
  • KVO是键值监听,能够监听一个对象属性值的改变

16. What is purpose of delegates?


  • 两个对象之间传递数据和消息
  • 解耦,拆分业务逻辑

17. What are mutable and immutable types in Objective C?


  • mutable是可变类型,好比NSMutableArray,能够动态往里面添加元素
  • immutable是不可变类型,好比NSArray,固定的存储空间,不能添加元素

18. When we call Objective-C is runtime language what does it mean?


  • 动态绑定:对象类型在运行时才真正肯定
  • 多态性
  • 消息机制

19. What is difference between NSNotification and Protocol?


  • 经过NSNotification能够给多个对象传递数据和消息
  • 经过protocol(代理模式)只能给一个对象传递数据和消息

20. What is push notification?


  • 本地推送:程序内部弹出通知到用户设备
  • 远程推送:由APNS推送通知到用户设备

21. What is Polymorphism?


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

22. What is Singleton?


  • 单例:保证程序运行过程当中,永远只有一个对象实例

  • 目的是:全局共享一份资源、节省没必要要的内存开销

23. What is Responder Chain?



 响应者链:

  • UIResponder有一个Next responder属性,经过该属性能够组成一个响应者链,事件或消息在其路径上进行传递

  • 若是UIResponder没有处理传给它的事件,会将未处理的消息转发给本身的Next responder

  • Using Responders and the Responder Chain to Handle Events

  • If the text field does not handle an event, UIKit sends the event to the text field’s parent UIViewobject, followed by the root view of the window. From the root view, the responder chain diverts to the owning view controller before directing the event to the window. If the window cannot handle the event, UIKit delivers the event to the UIApplication object, and possibly to the app delegate if that object is an instance of UIResponder and not already part of the responder chain.

24. Difference between frame and bounds?


  • frame以父控件的左上角为坐标原点
  • bounds以控件自己的左上角为坐标原点

25. Difference between method and selector?


  • 经过一个selector能够找到方法地址,进而调用一个方法

26. Is there any garbage collection mechanism in Objective-C?

  • Objective-C1.0没有垃圾回收
  • Objective-C有垃圾回收,只能用在Mac上
  • iOS中有ARC机制,是编译器特性,垃圾回收是运行时特性

27. What is NSOperation queue?


  • 用来存放NSOperation对象的队列,能够用来异步执行一些操做
  • 通常能够用在网络请求等耗时操做

28. What is lazy loading?


  • 延迟加载:好比控制器的view,在第一次用到view时才会调用loadView方法进行建立

29. Can we use two tableview controllers on one viewcontroller?

  • 从技术角度上分析,一个控制器内部添加2个表格控制器是没有问题的

30. Can we use one tableview with two different datasources? How you will achieve this?



  • 从对象属性上分析,tableView只有一个dataSource属性。固然,真要使用2个不一样的数据源,仍是有其余办法解决的

31. When to use NSMutableArray and when to use NSArray?

  • 当数组元素须要动态地添加或者删除时,用NSMutableArray
  • 当数组元素固定不变时,用NSArray

32. Give us example of what are delegate methods and what are data source methods of UITableview.

  • 代理方法:返回tableView每行的高度、监听tableView每行的选中
  • 数据源方法:返回tableView数据的组数和行数、每行显示什么数据

33. How many autoreleasepool you can create in your application? Is there any limit?

  • 没有限制

34. If we don’t create any autorelease pool in our application then is there any autorelease pool already provided to us?

  • 系统会默认会不定时地建立和销毁自动释放池

35. When you will create an autorelease pool in your application?

  • 当不须要精确地控制对象的释放时间时,能够手动建立自动释放池

36. When retain count increase?

  • 当作一次retain或者copy操做,都有可能增长计数器

37. What are commonly used NSObject class methods?

  • NSObject常见的类方法有:alloc、new、description等

38. What is convenience constructor?

  • 像NSStirng的stringWithFormat,NSNumber的numberWithInt

39. How to design universal application in Xcode?

  • 建立项目时,Device选择Universal
  • 能够建立一套痛用的数据模型
  • 根据iPhone\iPad选择不一样的控制器(iPad可能用UISplitViewController)
  • 根据iPhone\iPad选择不一样的界面

40. What is keyword atomic in Objective-C?

  • atomic是原子性
  • atomic会对set方法的实现进行加锁

41. What are UIView animations?

  • UIView封装的核心动画能够经过类方法/block实现

42. How can you store data in iPhone applications?

  • 属性列表
  • Preference(NSUserDefaults)
  • 键值归档(NSKeyedArchiver、NSCoding)
  • SQLite数据库
  • Core Data

43. What is NSManagedObject model?

  • NSManagedObject是Core Data中的实体对象

44. What is predicate?

  • 谓词:能够以必定条件来过滤数组、字典等集合数据,也能用在Core Data的数据查询中

45. Objective-C有多继承吗?没有的话用什么代替?


  • OC是单继承,没有多继承
  • 有时能够用分类和协议来代替多继承

46. Objective-C有私有方法吗?私有变量呢?


  • OC没有相似@private的修饰词来修饰方法,只要写在.h文件中,就是公共方法
  • 可使用类扩展(Extension)来增长私有方法和私有变量

47. 关键字const什么含义?

const int a;

int const a;

const int *a;

int const *a;

int * const a;

int const * const a;
  • 前两个的做用是同样:a 是一个常整型数
  • 第3、四个意味着 a 是一个指向常整型数的指针(整型数是不可修改的,但指针能够)
  • 第五个的意思:a 是一个指向整型数的常指针(指针指向的整型数是能够修改的,但指针是不可修改的)
  • 最后一个意味着:a 是一个指向常整型数的常指针(指针指向的整型数是不可修改的,同时指针也是不可修改的)

48. static的做用?

  • static修饰的函数是一个内部函数,只能在本文件中调用,其余文件不能调用
  • static修饰的所有变量是一个内部变量,只能在本文件中使用,其余文件不能使用
  • static修饰的局部变量只会初始化一次,而且在程序退出时才会回收内存

49. 线程和进程的区别?

  • 一个应用程序对应一个进程,一个进程帮助程序占据一块存储空间
  • 要想在进程中执行任务,就必须开启线程,一条线程就表明一个任务
  • 一个进程中容许开启多条线程,也就是同时执行多个任务

50. 堆和栈的区别?


  • 堆空间的内存是动态分配的,通常存放对象,而且须要手动释放内存
  • 栈空间的内存由系统自动分配,通常存放局部变量等,不须要手动管理内存

51. 为何不少内置的类,如TableView的delegate的属性是assign不是retain?


  • tableView的代理通常都是它所属的控制器,控制器会对它内部的view作一次retain操做
  • 假设tableView也对代理(控制器)作一次retain操做,那么就出现循环retain问题

52. 定义属性时,什么状况使用copy、assign、retain?


  • copy:NSString、Block等类型
  • assign:非OC对象类型, 基本数据类型(两个对象相互引用的时候,一端用retain, 一端用assign)
  • retain:OC对象类型

53. 对象是何时被释放的?


  • 每一个对象都有一个引用计数器,每一个新对象的计数器是1,当对象的计数器减为0时,就会被销毁

54. tableView的重用机制?


  • 这里只是简述:将离开屏幕的cell放到缓存池,从新拿来显示到屏幕的其余位置(其余本身详细描述)

55. ViewController 的loadView、viewDidLoad、viewDidUnload分别是何时调用的,在自定义ViewCointroller时在这几个函数中应该作什么工做?

  • loadView
  • 当第一次使用控制器的view时,会调用loadView方法建立view
  • 通常在这里自定义view
  • viewDidLoad
  • 当控制器的view建立完毕时会调用,也就是在loadView后调用
  • 通常在这里添加子控件、初始化数据
  • viewDidUnload
  • 当控制器的view由于内存警告被销毁时调用
  • 通常在这里回收跟界面相关的资源(界面都会销毁了,跟界面相关的资源确定不要了)

56. ViewController的didReceiveMemoryWarning是在何时调用的?默认的操做是什么?


  • 当应用程序接收到系统的内容警告时,就有可能调用控制器的didRece…Warning方法
  • 它的默认作法是:当控制器的view不在窗口上显示时,就会直接销毁,而且调用viewDidUnload方法

57. 怎么理解MVC,在Cocoa中MVC是怎么实现的?


  • M:Model,模型,封装数据
  • V:View,视图界面,负责展现数据
  • C:Controller,控制器,负责提供数据(Model)给界面(View)

58. self.跟self->什么区别?


  • self.是调用get方法或者set放
  • self是当前自己,是一个指向当前对象的指针
  • self->是直接访问成员变量

59. id、nil表明什么?

  • id类型的指针能够指向任何OC对象
  • nil表明空值(空指针的值, 0)

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

  • Product —> Profile —> Time Profiler

跳转:iOS面试题总结

相关文章
相关标签/搜索