1.@interface和@property的区别
- 在@interface中定义的变量,这能在当前的类中访问,在其他类中是访问不了的;而用@property声明的变量可以在外部访问。
- 用@property声明的变量,可以用点语法(self.变量名)的方式去读写,而用@interface的方式声明的就不可以,必须要写set和get方法。通过方法访问变量。
2.#import跟#include有什么区别。
- #import是#include的改进版,#import确保引用的文件只会被引用一次,这样就不会陷入递归包含的问题中。
3.@class和#import有什么区别
- #import会导入该文件的全部信息,包含实体变量和方法等。而@class只告诉编译器,后面声明的是名称是类的名称,不会包含变量和方法等。一般在头文件中使用@class,只需要知道被引用类的名称就可以了。
4.OC有多继承吗。
- OC是单继承的编程语言,用代理代替离开多继承。
5.@property属性声明中参数
- 读写属性:(readwrite/readnoly)
- 内存管理:(assign/retain/copy)(strong)
- 原子性:(atomicity/nonatomic)
6.NSMutabDictionary 的 setvalueforkey 和 setobjectforkey 的区别
- setObject:forkey:中value是不能够为nil的;setValue:forKey:中value能够为nil,但是当value为nil的时候,会自动调用removeObject:forKey方法
- setValue:forKey:中key只能够是NSString类型,而setObject:forKey:的可以是任何类型
7.@synthesize和@dynamic
- 如果两个在@property的属性都没写,那么默认@syntheszie var = _var
- @synthesize :如果没有手动实现set和get方法,那么编译器会自动为你加上这个方法。
- @dynamic:属性的set和get方法都需要用户自实现,如果没有实现,编译时并不会报错,但是运行 instance.var = some 时程序会崩溃。
8.异常处理
@try,@catch,@thorw,@finally。当代码有可能出现异常时,我们把他放到@try语句块中。@catch()块包含了处理@try块里的抛出的异常的逻辑。无论异常是否发生,@finally块里面的语句都会执行。如果直接使用@throw块来抛出异常,这个异常本质上是一个OC的对象。咱们可以使用NSException对象,但是不局限于他们。
9.弱引用(week)和强引用(strong)
- 默认情况下,一般指针都会用强引用(strong),只要引用存在,对象就不能被销毁,当所有强引用都去除时,对象才能被收集和释放。
- 一些集合类不应该增加其元素的引用,因为会引起对象的无法释放。在这种情况下,需要使用弱引用(week)。当被引用对象消失时,弱引用会自动设置为nil。
10.OC的字符串和C字符串的区别
- OC的字符串是对象,c的字符串是数组
11.OC的数组和C数组的区别
- OC的数组是系统封装好的对象,c的数组是联想的内存空间
12.什么是面向对象,和面向过程的区别
- 面向对象是把问题事物分解成一个一个对象,建立对象是为了解决问题的步骤中的行为。
面向对象是以功能来划分问题,而不是步骤。
面向过程是以步骤来解决问题,而不是功能。
面向对象设计的程序有良好的可移植性和可拓展性
面向对象的三大特性:封装、多态、继承
13.封装、多态、继承
-
封装:将数据或方法集合在一个单元中(我们俗称的‘类’),提供相对应的接口。封装是实现面向对象程序设计的第一步。
封装的好处:1.封装使得对代码的修改更加安全和容。2.封装是整个软件的开发复杂度大大降低。3.封装还可以避免命名冲突的问题。 -
多态:通以操作作用不同对象,可以有不同的解释,产生不同的执行结果。
通常就是强制类型转换 -
继承:一个子类继承父类,有其父类的所有方法和属性。
继承分单继承(一个类只能有一个父类)和多继承(一个类可以有多个父类)。
OC 是单继承(通过协议的方式解决多继承的问题)
继承的好处:1.一高了代买的复用性。2.让类与类之间产生了关系,提供了另一个特征多态的前提。
14.重载和重写的区别
- 重写:子类方法覆盖父类方法,要求方法名和参数名都要一样。
- 重载:通一个类的两个及以上的方法,拥有相同的方法名,但是参数不一样,方法体也不一样,最常见的例子就是类的重构函数。
15.oc的内存管理机制是什么。
- OC的内存管理机制是ARC,自动引用计数
当一个对象被创建之后它的引用计数为1,当调用这个对象的alloc、retain、new、copy方法之后引用计数值会自动在原来的基础上加1,当调用release方法之后它的引用计数值减1,如果一个对象的引用计数为0,则系统会自动调用这个对象dealloc方法来销毁这个对象
16.自动释放池
自动释放池使用@autoreleasepool关键字声明一个代码块,如果一个对象在初始化时调用了autorelease方法,name代码块执行完之后,在块中调用过autorelease方法的对象都会自动调用一次release。
- 1.autorelease方法不会改变对象的引用计数,只是将这个对象放到自动释放池中。
- 2.自动释放池实质是当自动释放池销毁之后,调用release方法,但是不一定能够销毁对象。例如当对象的引用计数大于1的时候,该对象是无法销毁的
- 3.由于自动释放池是最后统一销毁对象。因此如果一个比较占用的内存的对象或者操作,最好不要放到自动释放池
17.深复制和浅复制
- 浅复制:就只拷贝对象,对象的属性不拷贝,拷贝出来的对象和原来的对象共用属性,即指向同一个属性的地址。
- 深复制:不仅拷贝了一个对象还拷贝了它的属性。即完全是两个东西,只不过内容相同而已。
18.KVC是什么?KVO是什么?
- KVC:key value coding, 是一个非正式的protocol,提供一种机制来间接访问对象的属性
- KVO:key value observing ,它能够观察一个对象的值的变化。
19.ios中的回调机制有哪些
代理模式
Block
单例
通知
20.常用的数据储存方式
1.数据库
2.Plist
3.归档
4.Nsuerdefault
21.14.类别category
这个是OC的语言的一个特性,可以在不改变类型和原来类的实现的前提下,实现对类的方法拓展。
网友评论