回顾:
C
C语言的基础语法
数组
函数
OC
XCODE版本(7.3) 电脑系统版本(MAC OS X EI Capitan)
移动设备版本(iOS9.1)
面向对象oop(OC) 面向过程(C)
面向过程 是流程化 每一步 都会影响到下一步的执行 甚至到程序是否成功执行完毕
面向对象 不受步骤的约束 在操作的时候 如果没有这个对象 也不会受到严重影响
import、#include和@class有什么区别
@class一般用于头文件中需要声明该类的某个实例变量的时候用到,它只是声明了一个类名,关于这个类的内部实现都没 有告诉编译器,在m文件中还是需要使用#import。
而#import比起#include的好处就是不会引起交叉编译。
面向对象的三大特征
封装
继承
多态
内存管理
内存管理的原则
只要有alloc retain copy (retainCount +1)就要有对应的release(retainCount -1)
谁分配 谁释放
retain 表示持有(保留)特性 引用计数加1
copy 拷贝一份赋值 会生成一个不受上一个对象影响的对象9
alloc 这个函数 相对对的函数
delloc 销毁对象的时候调用
alloc 给对象分配内存的时候调用
autorelease 与release 的区别
release autorelease 都可以是对象的引用计数-1
release立即释放
autorelease 延迟释放
自动释放池NSAutoreleasePool
@autoreleasepool{
}
不用去关注 对象的释放时间
当出池的时候 自动释放(调用 autorelease)
自动释放池 也是一个对象 如果用 alloc init 初始化 也需要 释放自动释放池的对象
自动释放池的使用
for (int i=0; i<10; i++) {
@autoreleasepool {
NSObject *obj = [[[NSObject alloc] init]autorelease];
}
}
setter getter 的内存管理
(void)setUser:(NSObject *)user{
if (_user!=user) {
[_user release];
_user = [user retain];
}
}(NSObject *)user{
return _user;
}(void)dealloc{
[super dealloc];
[_user release],_user = nil;
}
继承 category的区别
继承 可以添加 变量
调用的时候 可以使用 子类的对象去调用 子类拥有父类的所有属性 方法 包括category 协议。。。
category 只能添加 方法
调用的时候 使用原有类的对象去调用
OC里面有多继承么?怎么实现多继承呢
没有多继承 可以多级 继承
可以使用代理来实现
category estensiton 区别
category 类目 在不改变原有类的情况下 给他扩充方法
estensiton 延展 添加 不公开的 变量 属性 方法
什么是protocol
是协议 是一个 统一的对外接口 可以通过他来实现 查找多个类的方法
什么是代理 写个完整的代理
代理 又叫委托 自己不能完成的 委托给别人完成
可用于回调
代理 通知的区别
代理 是一对一的
通知 是一对多的
通知 KVO 的区别
KVO 是键值观察者 通过观察的属性值 发生改变 去调用 观察的方法
通知 通过通知名字 来发送 接收通知
KVO KVC的区别
KVC 键值编码 通过把属性名 当成key 来改变属性的值
KVO 键值观察者 通过KVC的方式 把属性当做key 来观察属性值的变化 做出响应
在实际工作中 在哪用到了 KVC KVO
数据转模型 用到了KVC
封装下拉改变导航栏透明度的时候 使用的是KVO
声明是单例 singleton
通过方法 让对象只创建一次
可以避免重复创建 节省内存开支
使用环境:
不需要重复创建的操作类中 封装数据库 网络请求
某个固定的对象 不希望在使用的时候 被创建成其他的对象(当前用户)
写一个单例
(id)defaultManager{
static ClassName *name = nil;
if (!name) {
name = [[ClassName alloc] init];
}
return name;
}(id)defaultManager{
static ClassName *name = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
name = [[ClassName alloc] init];
});
return name;
}
在实际开发的时候 使用通知 KVO 会出现 崩溃现象 你是怎么解决的?
通知 KVO 的时候 需要移除 观察者
block 在实际项目中的使用
block 做回调函数 可替代代理
写一个代理 用block来替代(上机)
什么是懒加载
在使用的时候 才去创建
写一个懒加载
readwrite,readonly,assign,retain,copy,nonatomic 、strong、weak属性的作用?并区别
strong(强引用)、 weak(弱引用)?什么情况使用copy,assign,和retain?
readwrite 是可读可写特性;需要生成getter方法和setter方法时
readonly 是只读特性 只会生成getter方法
不希望属性在类外改变
assign 直接赋值 基本数据类型
retain 表示持有(保留)特性 引用计数加1
copy 拷贝一份赋值 会生成一个不受上一个对象影响的对象
nonatomic 非原子操作,决定编译器生成的setter getter是否是原子操作,atomic 原子操作表示多线程安全,UI(主)线程使用 nonatomic
strong强引用->属性所属的对象被释放的时候 这个属性 才会被释放 weak弱引用->不稳定的 可能会被释放掉
-面试题
Objective-C有私有方法么?私有变量呢?如多没有的话,有没有什么代替的方法?
objective-c类里面的方法只有两种, 静态方法和实例方法.但是可以通过把方法的声明和定义都放在.m文件中来实现一个表 面上的私有方法。有私有变量,可以通过@private来修饰,或者把声明放到.m文件中。在Objective‐C中,所有实例变 量默认都是私有的,所有实例方法默认都是公有的
c c++ 和obj-c如何混用?
1)obj-c的编译器处理后缀为m的文件时,可以识别obj-c和c的代码,处理mm文件可以识别obj-c,c,c++代码,但cpp文件必须只
能用c/c++代码,而且cpp文件include的头文件中,也不能出现obj- c的代码,因为cpp只是cpp。
2) 在mm文件中混用cpp直接使用即可,所以obj-c混cpp不是问题
3)在cpp中混用obj- c其实就是使用obj-c编写的模块是我们想要的。如果模块以类实现,那么要按照cpp class的标准写类的定 义,头文件中不能出现obj-c的东西,包括#import cocoa的。 实现文件中,即类的实现代码中可以使用obj-c的东西,可以import,只是后缀是mm。如果模块以函数实现,那么头文件要按 c的格 式声明函数,实现文件中,c++函数内部可以用obj-c,但后缀还是mm或m。总结:只要cpp文件和cpp include的文件中不包含 obj-c的东西就可以用了,cpp混用obj-c的关键是使用接口,而不能直接使用实现代码,实际上cpp混用的是obj-c编译后的o文 件,这个东西其实是无差别的,所以可以用。obj-c的编译器支持cpp。
objc优缺点----OC的特点:id类型,动态
objc优点:
1)Cateogies 2)Posing 3)动态识别 4)指标计算 5)弹性讯息传递
6)不是一个过度复杂的C衍生语言 7)Objective-C与C++可混合编程
缺点:
1)不支援命名空間 2)不支持运算符重载 3)不支持多重继承 4)使用动态运行时类型,所有的方法都是函数调用,所以很多编译时优化 方法都用不到。(如内联函数等),性能低劣。
什么是Archiver 序列化 归档 coding :NSKeyedArchiver NSKeyedUnarchiver
可以做什么?
做缓存 保存数据
如果对象不支持归档 怎么让他支持归档
自定义归档 重写 - (void)encodeWithCoder:(NSCoder *)aCoder;
- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder;
浅复制和深复制的区别?
浅层复制(copy):只复制指向对象的指针,而不复制引用对象本身。//通过对象的指针来访问这个对象----只赋值地址 深层复制(mutableCopy):复制引用对象本身---再创建一个对象 意思就是有个A对象,复制一份后得到A_copy对象后,对于浅复制来说,A和A_copy指向的是同一个内存资源,复制的 只不过是是一个指针,对象本身资源 还是只有一份,那如果我们对A_copy执行了修改操作,那么发现A引用的对象同样被修改,这其实违背了我们复制拷贝的一 个思想。深复制就好理解了,内存中存在了两份独立对象本身。//当修改A时,A copy不变。
便利构造器
+(id)Person{
Person *person=[Person alloc]init];
return person;
}
自定义构造方法
怎样拷贝 不支持拷贝的对象
给这个类 添加 拷贝协议(NSCoping NSMutableCoping) 并实现 拷贝协议- (id)copyWithZone:(nullable NSZone *)zone
- (id)mutableCopyWithZone:(nullable NSZone *)zone
怎样通过KVC 访问某个类中 对象中的 对象的属性值
通过键路径的方式 setVaule forKeyPath:
键路径是通过.是区分key的层次 类似表示路径的/
数据持久化存储方式有哪些?以及特点
1.plist 属性列表 最外层只能存储数组字典 里面只能存储 bool NSNumber String Data Date
2.NSUserDefault 最终也是保存成plist 系统封装了保存的路径 保存的方法
3.归档 可以对保存数据的文件 进行加密
4.sqlite 关系型数据库 以表的形式存储 FMDB是对 OC中 sqlite操作封装 的第三方库
5.coreData 是苹果封装的 对文件操作的框架 可以 以对象的形式存储 底层数据文件可以是sqlite类型 也可以是XML JSON …