1. 怎么看程序有没有内存泄露?
a. 非ARC模式下用Analyze-------可以查看内存泄露,变量未初始化,变量定义后买有使用到等等
b. 多人开发尽量采用ARC
2. 非自动内存管理下做单例模式?
a. 单例->类创建的对象只有一个
b. 一般工具类的对象应该只有一个
c. ARC情况下和非ARC情况下:
// 单例头文件
//定义一个宏,实现.h文件的接口调用 ->##注意这个的用法
#define Singleton(methodName) +(instancetype) shared##methodName;
//定义一个宏,实现.m文件的接口调用,注意\表示下面一行的代码也是属于这个宏的,传入两个参数
#if __has_feature(objc_arc)//如果是arc的情况下
#define SingletonM(methodName)\
static id _instance = nil; \
+(id)allocWithZone:(struct _NSZone *)zone{\
if (_instance == nil) {\
static dispatch_once_t onceToken;\
dispatch_once(&onceToken, ^{\
_instance = [super allocWithZone:zone];\
});\
}\
return _instance;\
}\
-(id)init{\
static dispatch_once_t onceToken;\
dispatch_once(&onceToken, ^{\
_instance = [super init];\
});\
return _instance;\
}\
+(instancetype) shared##methodName{\
return [[self alloc]init];\
}
#else
#define SingletonM(methodName)\
static id _instance = nil; \
+(instancetype)allocWithZone:(struct _NSZone *)zone{\
if (_instance == nil) {\
static dispatch_once_t onceToken;\
dispatch_once(&onceToken, ^{\
_instance = [super allocWithZone:zone];\
});\
}\
return _instance;\
}\
-(instancetype)init{\
if (_instance == nil) {\
static dispatch_once_t onceToken;\
dispatch_once(&onceToken, ^{\
_instance = [super init];\
});\
}\
return _instance;\
}\
+(instancetype) shared##methodName{\
return [[self alloc]init];\
}\
-(oneway void)release{\
}\
-(instancetype)retain{\
return self;\
}\
-(NSUInteger)retainCount{\
return 1;\
}
#endif
3. 对于类方法(静态方法)默认都是autorelease的,所有的类方法都是这样的吗?
a. 系统绝大多数类方法返回的对象都是经过autorelease的
b. 比如alloc就没有autorelease
4. 内存泄露:
该释放的没有释放
5. 内存溢出:
内存不够用,out of memory
6. Json数据的解析:
a. 方案:
i. SBJSon
ii. JSONKit
iii. NSJSONSerialization
b. 没有内存泄露,看具体的代码
7. KVO:
runtime:运行时,产生类
a. 让一个对象监听另外一个对象属性的改变
b. 底层实现:调用NSKVONotifying
c. 坏处:底层会动态产生新的类
8. Foundation对象和Core foundation对象的区别?
a. 前者对象是OC的,后者对象是C对象
b. 数据类型之间的转换
i. ARC :__bridge retained或者__bridge transfer
ii. 非ARC:__bridge
9. 什么是懒加载?
a. 通俗的讲就是要用到的时候采取加载,延时加载的意思
b. 可以避免内存过高
10. 数据库文件放在那里?
a. 放在沙盒里面的documents文件夹中
11. runtime运行时:
a. 是什么?
i. 比较底层的纯C语言API
ii. 平时编写的OC代码,在程序运行过程中,其实最终转成了runtime的C语言代码
b. 用过么?怎么用?->非常底层的操作
i. 举例说明:
1) OC 创建一个Person对象 [[Person alloc]init]
2) 相应的转为runtime的C语言实现:objc_msgSend(objc_msgSend("Person","alloc"),"init")
ii. 在程序运行过程中动态的创建一个类
iii. 在程序运行过程中动态的为某个类添加或者修改属性以及方法
iv. 遍历一个类的所有的成员变量属性或者方法
c. 应用场合:
i. NSCoding(归档和接档)
ii. 字典转模型(runtime遍历模型对象的所有属性,根据属性名从字典中取出对应的值设置到模型的属性上)
iii. KVO利用runtime动态产生一个类
d. 相关函数:
i. objc_msgSend()给对象发送消息
12. 视图控制器在APP运行时候的调用顺序?
a. loadView:
i. 控制器的View为nil的时候调用,一般用于代码的方式去创建View的时候用到
b. viewDidLoad:
i. 调用了loadView方法将视图载入到内存中,再调用这个方法进一步的设置,初始化数据等等
ii. 这个方法只会在APP刚开始加载的时候调用一次,后面就不会再调用了
c. viewDidUnload:
i. 在系统退出或者收到内存警告的时候才会被调用
d. viewWillAppear:
i. 系统载入所有数据后将要在屏幕上显示视图的时候将会调用这个方法
e. viewWillDisappear:
i. 视图变换,当前的视图即将被移除或者被覆盖的时候调用这个方法
f. viewDidDisppear:
i. 视图已经消失的时候调用这个方法
g. viewDidAppear:
i. 视图已经显示出来了
h.
13. 为什么很多内置类比如UITableViewController的delegate属性都是assign而不是retain?
a. 防止循环引用而释放不了对象
14. OC中的反射机制?
a. Class反射:
i. 通过类名的字符串形式实例化对象
Class class = NSClassFromString(@"ViewController");
ViewController * sonController = [[class alloc]init];
ii. 将类名变成字符串
Class class1 = [ViewController class];
NSString * className = NSStringFromClass(class1);
b. 构造方法反射:
i. 类似
15. 数据类型所占用的字节数总结?
a. int 4
b. double 8
c. float 4
d. char 1
e. array 4
f. 注意结构体中掺杂其中的数据类型,最后的大小以最大字节数的那个数据类型的倍数来算
16. 对于语句NSString * obj =[ [NSData alloc]init]; obj在编译时和运行时的类型是什么?
a. 编译时是NSData,运行时时NSString
17. OC中有私有方法吗?或者私有变量?
a. OC没有类似@private的修饰词来修饰方法,只要写在.h文件中的就是公共方法
b. 在.m文件中声明和实现的方法对于编译器来说就是私有的