OC知识点总结:
- oc中没有多继承。可以使用委托代理实现多继承,ood的多态行在OC中通过委托实现
- OC中没有私有方法,只有静态方法和实例方法。但是我们可以通过延展的形式来声明私有方法和私有变量。@private修饰的变量也是私有变量,只有本类可以调用,其它类和子类不可以调用。
- const的意思是只读。用const修饰的都是不可以改变的。当然,只限于紧挨着const的变量。例如:const int
*a; 和int *const a; 的意义是不一样的 - #import和#include的区别,@class代表什么?
@class一般用于头文件中需要声明该类的某个实例变量的时候用到,在m文件中还是需要使用#import。使用@class的时候是需要用";"分号结尾的
#import比起#include的好处就是不会引擎重复包含
内存管理: - 当你使用new / alloc / copy 方法创建一个对象时候,该对象的引用计数器值为1,当你不再使用该对象的时候,你要负责向该对象发送一条release或autorelease消息。这样,该对象将在使用寿命结束时被销毁。
- 当你通过任何其他的方法获取一个对象时,则假设该对象的引用计数器值为1,而且已经被设置为自动释放,你不需要执行任何操作确保该对象被清理。如果你打算在一段时间内拥有该对象,则需要保留它并在操作完成时释放它
- 如果保留了某个对象,你最终需要释放或自动释放该对象,必须保持retain方法和release方法的使用次数相等。
- 对象什么时候被release的?
引用计数为0时。
autorelease实际上只是把对release的调用延迟了,对于每一个autorelease,系统只是把该Object放入了当前的autoreleasepool中,当pool被释放时,该pool中的所有对象会呗release。对于每一个runloop,系统会隐式创建一个autoreleasepool,这样所有的release pool会构成一个想CallStack一样的栈式结构,在每一个Runloop结束时,当前栈顶的autoreleasepool就会被销毁,这样这个pool里的每个object会被release。那么什么是一个Runloop呢?一个UI事件,Timer call, delegate call, 都会是一个新的Runloop。 - IOS有没有垃圾回收机制? 答:Objective-C 2.0也是有垃圾回收机制的,但是只能在Mac OS X Leapard 10.5以上的版本使用。ios中是没有GC的。
- 内存管理autorelease 、 retain 、 copy 、 assign 、 的set方法和含义?
你初始化(alloc / init)的对象,你需要释放(release)它
你retain或copy的,你需要释放(release)它 - NSArray对象会retain任何数组中的对象。当NSArray被dealloc的时候,所有数组中的对象被执行一次释放。不仅仅是NSArray,任何搜集类(Collection Classes)都执行类似操作。例如:NSDictionary,甚至UINavigationController。
- 定义属性的时候:
assign用于简单的数据类型,如NSInteger,double,bool,int等。
retain和copy用于对象。
copy用于当a指向一个对象,b也想指向同样的对象的时候,如果用assign,a如果释放,再调用b会crash。如果用copy的方法,a和b有自己的内存,就可以解决这个问题
retain会是引用计数器加1,也可以解决assign的问题
atomic和nonatomic用人决定编译器生产的getter和setter时候为原子操作。在多线程的环境下,原子操作是必要的,否则有可以引起错误的结果。
- delegate和nontification的区别?分别在什么情况下使用?
Delegate:
消息的发送者告知接收者某个事件将要发生,delegate同意然后发送者响应事件。delegate机制使得接受者可以改变发送者的犀利哥为。通常发送者和接收的关系是直接的一对多的关系。
Notification:
消息的发送者告知接受者事件已经发送或者将要发送,仅此而已,接受者并不能反过来影响发送者的行为。通常发送者和接收者的关系是间接的多对多的关系。
- id、nil代表什么?
id和void *并非完全一样。id是一个指向任何一个继承了Object(或者NSObject)类的对象。需要注意的是id是一个指针,所以你在使用id的时候不需要加*号。
nil和C语言的NULL相同,在OC中,nil表示一个Objective-C对象,这个对象的指针指向空。
首字母大写的Nil和nil有一点不一样,Nil定义一个指向空得类(是Class,而不是对象) ;
SEL是“selector”的一个类型,表示一个方法的名字
IMP定义为id(*IMP)(id, SEL,…)。这样说来,IMP是一个指向函数的指针,这个被指向的函数包括id("self"指针),调用的SEL(方法名),再加上一些其他参数,说白了IMP就是实现方法。
- 类别的作用:
有时候需要在一个已经定义好的类中增加一些方法,而不像去重写该类。可以使用类别(category)对该类就行扩充新的方法。
注意:类别只能扩充方法,而不能扩充成员变量。要想扩充成员变量,可以使用延展。
- 委托:
委托代理(delegate),顾名思义,把某个对象要做的事情委托给别的对象去做。那么别的对象就是这个对象的代理。
委托机制是一种涉及模式。
- 属性readwrite、readonly、assign、retain、copy、nonatomic各是什么作用?在哪种情况下使用?
assign:指定setter方法用简单的赋值。这个是默认操作,
retain:指定retain应该在后面的对象上调用,前一个发送一条release消息。
copy:指定应该使用对象的副本(深度复制),前一个发送一条release消息。基本上像retain,但是没有增加引用计数,是分配一块新的内存来放置它。
readonly:将只生成getter方法而不生成setter方法
readwrite:默认属性,将生成不带额外参数的getter和setter方法
atomic;对于对象的默认属性,就是setter、getter生成的方法是一个原子操作。
nonatomic:不保证setter、getter的原子性,多线程情况下数据可能有问题
- 类变量的@protected、@private、@public、@package什么各有什么含义?
OC对存取权限的设定,也是变量的作用域。
@protected:该类和所有的子类中的方法可以直接方法的变量,这是默认的。
@private:该类中的方法可以访问,子类不可以。
@public:除了自己和子类中的方法可以访问外,也可以被其他的类或其他的模块中的方法访问。开放性最大。
@package:对于64位图像,这样的成员变量可以在实现这个类的图像中随意访问。
- 钱拷贝和深拷贝的区别?
在有指针的情况下,浅拷贝只是增加了一个指针指向已经存在的内存,而深拷贝就是增加了一个指针并且申请了一块新的内存,使这个增加的指针指向这个新的内存,才用深拷贝的情况下,释放内存的释放就不会出现浅拷贝时重复释放同一内存的错误。
- 自动释放池和GC有什么区别?iphone上有GC么?[pool release]和[pool drain]有什么区别?
同一个对象可以多次调用"autorelease"方法,并可以放到同一个自动释放池中。
你可以用alloc、init方法创建一个NSAutoreleasePool对象,并且可以调用release或drain(release与drain的区别就是drain在有GC的环境中会引起GC的回收操作,release则反之。但在非GC的环境中,两者相同。官方的说法是为了程序的兼容性,应该考虑使用drain代替release)方法来回收它(调用它的autorelease或retain方法会引起异常)。 在一个完整的上下文的最后Autorelease Pool对象应该被release掉。
Autorelease Pool的所有实例在栈中管理,并且是可以被嵌套的。
- timer的间隔周期准吗?为什么?怎样实现一个精准的timer?
NSTimer可以精确到50-100毫秒
NSTimer不是绝对准确的,而且中间耗时或柱塞错过下一个点,那么下一个点就pass过去了。