2018-04-09面试题

1、property常用的修饰符,常用的属性
atomic/nonatomic、readwrite/ readonly、assign、strong、weak、copy、unsafe_unretained、retain
2、用@property声明的NSString(或NSArray,NSDictionary)经常使用copy关键字,为什么?如果改用strong关键字,可能造成什么问题?
用@property声明 NSString、NSArray、NSDictionary 经常使用copy关键字,是因为他们有对应的可变类型:NSMutableString、NSMutableArray、NSMutableDictionary,他们之间可能进行赋值操作,为确保对象中的字符串值不会无意间变动,应该在设置新属性值时拷贝一份。如果我们使用是strong,那么这个属性就有可能指向一个可变对象,如果这个可变对象在外部被修改了,那么会影响该属性。
copy此特质所表达的所属关系与strong类似。然而设置方法并不保留新值,而是将其“拷贝” (copy)。 当属性类型为NSString时,经常用此特质来保护其封装性,因为传递给设置方法的新值有可能指向一个NSMutableString类的实例。这个类是NSString的子类,表示一种可修改其值的字符串,此时若是不拷贝字符串,那么设置完属性之后,字符串的值就可能会在对象不知情的情况下遭人更改。所以,这时就要拷贝一份“不可变” (immutable)的字符串,确保对象中的字符串值不会无意间变动。只要实现属性所用的对象是“可变的” (mutable),就应该在设置新属性值时拷贝一份。
3、#import跟#include有什么区别,@class呢?
C/C++中包含头文件时用#include。( 使用include要注意重复引用的问题:解决办法#ifndef/#define/#endif)
#import 确定一个文件只能被导入一次,避免了重复引?的问题,在OC中我们基本用的都是 import。 #import< > 包含iOS框架类库?的类, #import""包含项目中自定义的类。@class通知编译器,其后面声明的名称是类的名称,至于这些类是如何定义的,暂时不用考虑
4、IOS中持久化方式有哪些?
NSUserDefaults、plist、Archiving:归档、SQLite3和Core Data
5、通知和代理的区别?
观察者模式:一个对象(A)想知道另一个对象(B)的状态是否发生了变化,A对象随B对象状态的改变而改变的过程,可以用观察的过程来控制,这种两个对象保持状态改变的一致的模式,叫做观察者模式
------共同点利用通知和代理都能完成对象间的通信。(比如A对象告诉D对象发生了什么事情,A对象传递数据给D对象)
------不同点代理:只能是一对一的关系(一个对象只能告诉另外一个对象发生了什么事情)通知:多对多关系(一个对象能告诉N个对象发生了什么事情,一个对象能得知N个对象发生了什么事情)
6、什么是KVC和KVO
转载https://www.cnblogs.com/huadeng/p/7064382.html
7、Objective-C有多重继承吗?不是的话有什么代替方法?
没有多重继承( )多继承在这里是用protocol 委托代理 来实现的
8、简述线程与进程的区别和联系?
进程和线程都是操作系统中程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。差别在与不同的操作系统资源管理方式。
进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程知识一个进程中的不同执行路径。
线程有自己的堆栈和局部变量,但线程之间没有独立的地址空间,一个线程死掉就等于整个线程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
9、冒泡排序
NSMutableArray *array = [NSMutableArray arrayWithObjects:@12,@15,@10,@80,@8, nil];
for (int i=0; i b){
//int temp = a;
// a=b
【2018-04-09面试题】// b=temp
[array exchangeObjectAtIndex:j withObjectAtIndex:j+1];
}
}
}
10、下面的代码有什么错误
-(void)setName:(NSString *)name{
self.name=name;
}
会造成死循环,self.name本身会调用setter和getter方法,改进:_name=name
11、如何修改并且访问一个私有属性
有两种方法,一种是通过KVC,一种是通过runtime
12、extension和category
extension只有.h文件,可以添加实例变量(成员变量),extension里声明的方法需要在mainimplementation中实现
category有.h和.m文件,不可以添加实例变量(成员变量){},但是属性可以添加(@property声明的),方法:定一个全局变量
@property(nonatomic,copy)NSString *testStr;
NSString *_testStr;
-(void)setTestStr:(NSString *)testStr{
_testStr = testStr;
}
-(NSString *)testStr{
return _testStr;
}
13、iOS 的沙盒目录结构是怎样的? App Bundle 里面都有什么?
.沙盒结构
.Application:存放程序源文件,上架前经过数字签名,上架后不可修改
.Documents:常用目录,iCloud备份目录,存放数据,这里不能存缓存文件,否则上架不被通过
.Library:
Caches:存放体积大又不需要备份的数据,SDWebImage缓存路径就是这个
Preference:设置目录,iCloud会备份设置信息
.tmp:存放临时文件,不会被备份,而且这个文件下的数据有可能随时被清除的可能
App Bundle 里面有
Info.plist:此文件包含了应用程序的配置信息.系统依赖此文件以获取应用程序的相关信息
可执行文件:此文件包含应用程序的入口和通过静态连接到应用程序target的代码
资源文件:图片,声音文件一类的
其他:可以嵌入定制的数据资源
14、有哪些常见的crash场景
访问了僵尸对象、访问了不存在的方法、数组越界、在定时器下一次回调前将定时器释放,会Crash
15、CocoaPods原理
1.Pods项目最终会编译成一个名为libPods.a的文件,主项目只需要依赖这个.a文件即可
2.对于资源文件,CocoaPods提供了一个名为Pods-resources.sh的bash脚本,该脚本在每次项目编译的时候都会执行,将第三方的各种资源文件复制到目标目录中
3.CocoaPods通过一个名为Pods.xcconfig的文件在编译时设置所有的依赖和参数




    推荐阅读