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

           // 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的文件在编译时设置所有的依赖和参数



你可能感兴趣的:(2018-04-09面试题)