1.#import 跟#include、@class有什么区别?#import<> 跟 #import””又什么区别?
1 2 3
| #import 和#include都是在当前文件引入某个文件的内容,#import能防止同一个文件被引用多次 @class 仅仅声明一个类名,并不包含类的完整声明,@class还能解决循环包换的问题 #import <> 用来包含系统自带的文件,#import “”用来包含自定义的文件
|
2.属性readwrite,readonly,assign,retain,copy,nonatomic 各是什么作用,在那种情况下用?
1 2 3 4 5 6
| 1.readwrite:同时生成get方法和set方法的声明和实现 2.readonly:只生成get方法的声明和实现 3.assign:set方法的实现是直接赋值,用于基本数据类型 4.retain:set方法的实现是release旧值,retain新值,用于OC对象类型 5.copy:set方法的实现是release旧值,copy新值,用于NSString、block等类型 6.nonatomic:非原子性,set方法的实现不加锁(比atomic性能高)
|
3.写一个setter方法用于完成@property (nonatomic,retain)NSString name,写一个setter方法用于完成@property(nonatomic,copy)NSString name.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| @property (nonatomic, retain) NSString *name; - (void)setName:(NSString *)name { if (_name != name) { [_name release]; _name = [name retain]; } } @property(nonatomic, copy) NSString *name; - (void)setName:(NSString *)name { if (_name != name) { [_name release]; _name = [name copy]; } }
|
4.对于语句NSString *obj = [[NSData alloc] init]; ,编译时和运行时obj分别是什么类型?
1 2
| 此题主要考察对运行时机制的理解,编译时是NSString类型 ,运行时是NSData类型. NSString *obj 对obj的类型没有任何的作用,只是告诉编辑器你要把obj当作NSString来使用,编辑器会给obj对象智能提醒和检测NSString的api,帮助你编写代码和语法检查,仅此而已。
|
5.常见的object-c的数据类型有那些, 和C的基本数据类型有什么区别?
1 2
| 1.常用OC类型:NSString、NSArray、NSDictionary、NSData、NSNumber等 2.OC对象需要手动管理内存,C的基本数据类型不需要管理内存
|
6.id 声明的变量有什么特性?
1 2 3
| id声明的变量能指向任何OC对象。 参照第4题,id声明的变量,相当于告诉编辑器, 此变量的类型暂无具体类型,就是id类型,具体什么类型运行时来决定。
|
7.Objective-C如何对内存管理的,说说你的看法和解决方法?
1 2 3 4 5
| 内存管理机制是每个iOS开发者需要了解的。 1.每个对象都有一个引用计数器,每个新对象的计数器是1,当对象的计数器减为0时,就会被销毁 2.通过retain可以让对象的计数器+1、release可以让对象的计数器-1 3.还可以通过autorelease pool管理内存 4.如果用ARC,编译器会自动生成管理内存的代码
|
8.深拷贝和浅拷贝的区别?
1 2
| 深拷贝:拷贝内容,产生新的对象。 浅拷贝:拷贝指针,不会产生新的对象
|
9.使用分类有什么优点?分类和继承的区别?
1 2 3
| 分类可以在不修改原来类模型的基础上拓充方法 分类只能扩充方法、不能扩充成员变量;继承可以扩充方法和成员变量 继承会产生新的类
|
10.分类和扩展的区别?
1 2 3
| 分类是有名称的,类扩展没有名称 分类只能扩充方法、不能扩充成员变量;类扩展可以扩充方法和成员变量 类扩展一般就写在.m文件中,用来扩充私有的方法和成员变量(属性)
|
11.KVC和KVO是什么?
1 2
| KVC是键值编码,可以通过一个字符串的key(属性名)修改对象的属性值 KVO是键值监听,可以监听一个对象属性值的改变
|
12.代理的目的是什么?
13.在Objective C中什么是mutable和immutable类型
1 2
| mutable是可变类型,比如NSMutableArray,可以动态往里面添加元素 immutable是不可变类型,比如NSArray,固定的存储空间,不能添加元素
|
14.什么是单例?
1 2 3
| 单例:保证程序运行过程中,永远只有一个对象实例 目的是:全局共享一份资源、节省不必要的内存开销 常见单例:UIApplication、NSUserDefaults、NSNotificationCenter、NSFileManager、NSBundle等
|
15.什么时候使用NSMutableArray,什么时候使用NSArray?
1 2
| 当数组元素需要动态地添加或者删除时,用NSMutableArray 当数组元素固定不变时,用NSArray
|
16.什么情况下对象引用计数器会增加?
1
| 当做retain或者copy操作的时候,都有可能增加计数器
|
17.在Objective C中关键字atomic有什么作用?
1 2
| atomic是原子性 atomic会对set方法的实现进行加锁
|
18.Objective C有私有方法和私有变量吗?
1 2
| Objective C中没有private,public类似的关键字来控制类的权限,写在.h文件中,就是公共方法 在.m文件中声明和实现的方法,对编辑器来说就是私有的
|
19.堆和栈的区别?
1 2
| 堆空间的内存是动态分配的,一般存放对象,并且需要手动释放内存 栈空间的内存由系统自动分配,一般存放局部变量等,不需要手动管理内存
|
20.@property中有哪些属性关键字?
1 2 3 4 5 6 7 8 9
| 1.readwrite(默认):同时生成get方法和set方法的声明和实现 2.readonly:只生成get方法的声明和实现 3.assign(默认):set方法的实现是直接赋值,用于基本数据类型 4.retain:set方法的实现是release旧值,retain新值,用于OC对象类型 5.copy:set方法的实现是release旧值,copy新值,用于NSString、block等类型 6.nonatomic:非原子性,set方法的实现不加锁(比atomic性能高) 7.atomic(默认):原子性,会在set方法加上读写锁 8.weak:弱指针类型,一般用于UI控件、id类型 9、strong (就是retain):强指针类型 一般用于OC对象类型,除 (UI控件、代理类型、字符串对象)
|
21.OC有多继承吗?没有的话用什么代替?
1
| OC是单继承,没有多继承,有时可以使用分类和协议来代替多继承。
|
22.关键字const什么含义?
1 2 3 4 5 6
| const int a; int const a; const int *a; int const *a; int * const a; int const * const a;
|
1 2 3 4
| 1> 前两个的作用是一样:a 是一个不可修改的常整型数,只读 2> 第三、四个意味着 a 是一个指向常整型数的指针(整型数是不可修改的,但指针可以) 3> 第五个的意思:a 是一个指向整型数的常指针(指针指向的整型数是可以修改的,但指针是不可修改的) 4> 最后一个意味着:a 是一个指向常整型数的常指针(指针指向的整型数是不可修改的,同时指针也是不可修改的)
|
23.static的作用?
1 2 3
| 1.static修饰的函数是一个内部函数,只能在本文件中调用,其他文件不能调用 2. static修饰的全局变量是一个内部变量,只能在本文件中使用,其他文件不能使用 3. static修饰的局部变量只会初始化一次,并且在程序退出时才会回收内存
|
24.自动释放池常见面试代码
1 2 3 4 5 6
| for (int i = 0; i < 10; ++i) { NSString *str = @"Hello World"; str = [str stringByAppendingFormat:@" - %d", i]; str = [str uppercaseString]; NSLog(@"%@", str); }
|
问:以上代码存在什么样的问题?如果循环的次数非常大时,应该如何修改?
1 2 3
| 解决办法1:如果i比较大,可以用@autoreleasepool {}解决,放在for循环外,循环结束后,销毁创建的对象,解决占据栈区内存的问题 解决方法2:如果i玩命大,一次循环都会造成自动释放池被填满,自动释放池放在for循环内,每次循环都将上一次创建的对象release
|
25.@private、@protected、@public、@package类型的成员变量的作用域?
1 2 3 4
| - @private:只能在当前类的对象方法中访问; - @protected:可以在当前类以及子类的实现中直接访问,默认类型; - @public:任何地方都可以直接访问对象的成员变量; - @package:同一个“体系内”(框架)可以访问;
|
26.这个写法会出什么问题:@property (copy) NSMutableArray *array;
?
1 2
| @property 的setter方法设置成copy以后,array这个指针指向的是一个不可变数组, 那么当使用点语法为给array赋值时,就会发生“unrecognized selector sent to instance”错误,程序就会崩溃。
|
27.调用对象的release 方法会销毁对象吗?
1
| 不会,调用对象的release 方法只是将对象的引用计数器-1,当对象的引用计数器为0的时候会调用了对象的dealloc 方法才能进行释放对象的内存。
|
28.什么情况使用 weak 关键字,相比 assign 有什么不同?
1 2 3 4 5 6
| 1>.什么情况使用weak关键字? - 在 ARC 中,在有可能出现循环引用的时候,往往要通过让其中一端使用 weak 来解决,比如: delegate 代理属性 - 自身已经对它进行一次强引用,没有必要再强引用一次,此时也会使用 weak,自定义 IBOutlet 控件属性一般也使用 weak;当然,也可以使用strong。 2>.weak与assign的不同? - weak 此特质表明该属性定义了一种“非拥有关系” (nonowning relationship)。为这种属性设置新值时,设置方法既不保留新值,也不释放旧值。此特质同assign类似, 然而在属性所指的对象遭到摧毁时,属性值也会清空(nil out)。 而 assign 的“设置方法”只会执行针对“纯量类型” (scalar type,例如 CGFloat 或 NSlnteger 等)的简单赋值操作。 - assigin 可以用非 OC 对象,而 weak 必须用于 OC 对象
|
29.XIB与Storyboards的优缺点?
1 2 3 4 5 6 7
| - XIB:在编译前就提供了可视化界面,可以直接拖控件,也可以直接给控件添加约束,更直观一些,而且类文件中就少了创建控件的代码,确实简化不少,通常每个XIB对应一个类。 - Storyboard:在编译前提供了可视化界面,可拖控件,可加约束,在开发时比较直观,而且一个storyboard可以有很多的界面,每个界面对应一个类文件,通过storybard,可以直观地看出整个App的结构。 - XIB:需求变动时,需要修改XIB很大,有时候甚至需要重新添加约束,导致开发周期变长。XIB载入相比纯代码自然要慢一些。对于比较复杂逻辑控制不同状态下显示不同内容时,使用XIB是比较困难的。当多人团队或者多团队开发时,如果XIB文件被发动,极易导致冲突,而且解决冲突相对要困难很多。 - Storyboard:需求变动时,需要修改storyboard上对应的界面的约束,与XIB一样可能要重新添加约束,或者添加约束会造成大量的冲突,尤其是多团队开发。对于复杂逻辑控制不同显示内容时,比较困难。当多人团队或者多团队开发时,大家会同时修改一个storyboard,导致大量冲突,解决起来相当困难。
|
30.@synthesize和@dynamic分别有什么作用?
1 2 3
| - @property有两个对应的词,一个是 @synthesize,一个是 @dynamic。如果 @synthesize和 @dynamic都没写,那么默认的就是@syntheszie var = _var; - @synthesize 的语义是如果你没有手动实现 setter 方法和 getter 方法,那么编译器会自动为你加上这两个方法。 - @dynamic 告诉编译器:属性的 setter 与 getter 方法由用户自己实现,不自动生成。(当然对于 readonly 的属性只需提供 getter 即可)。假如一个属性被声明为 @dynamic var,然后你没有提供 @setter方法和 @getter 方法,编译的时候没问题,但是当程序运行到 instance.var = someVar,由于缺 setter 方法会导致程序崩溃;或者当运行到 someVar = var 时,由于缺 getter 方法同样会导致崩溃。编译时没问题,运行时才执行相应的方法,这就是所谓的动态绑定。
|
31.objc中的类方法和实例方法有什么本质区别和联系?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| 类方法: - 类方法是属于类对象的 - 类方法只能通过类对象调用 - 类方法中的self是类对象 - 类方法可以调用其他的类方法 - 类方法中不能访问成员变量 - 类方法中不能直接调用对象方法 实例方法: - 实例方法是属于实例对象的 - 实例方法只能通过实例对象调用 - 实例方法中的self是实例对象 - 实例方法中可以访问成员变量 - 实例方法中直接调用实例方法 - 实例方法中也可以调用类方法(通过类名)
|
32.Objective-C 中是否支持垃圾回收机制?
1 2 3
| - OC是支持垃圾回收机制的(Garbage collection简称GC),但是apple的移动终端中,是不支持GC的,Mac桌面系统开发中是支持的. - 移动终端开发是支持ARC(Automatic Reference Counting的简称),ARC是在IOS5之后推出的新技术,它与GC的机制是不同的。我们在编写代码时, 不需要向对象发送release或者autorelease方法,也不可以调用delloc方法,编译器会在合适的位置自动给用户生成release消息(autorelease),ARC 的特点是自动引用技术简化了内存管理的难度.
|
33.在 Objective-C 中如何实现 KVO?
1 2 3 4 5 6 7 8 9 10
| - 注册观察者(注意:观察者和被观察者不会被保留也不会被释放) - (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context; - 接收变更通知 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context; - 移除对象的观察者身份 - (void)removeObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath; - KVO中谁要监听谁注册,然后对响应进行处理,使得观察者与被观察者完全解耦。KVO只检测类中的属性,并且属性名都是通过NSString来查找,编译器不会检错和补全,全部取决于自己。
|