OC知识点总结

OC知识点总结:
  1. oc中没有多继承。可以使用委托代理实现多继承,ood的多态行在OC中通过委托实现
  2. OC中没有私有方法,只有静态方法和实例方法。但是我们可以通过延展的形式来声明私有方法和私有变量。@private修饰的变量也是私有变量,只有本类可以调用,其它类和子类不可以调用。
  3. const的意思是只读。用const修饰的都是不可以改变的。当然,只限于紧挨着const的变量。例如:const int  *a;  和int *const a; 的意义是不一样的
  4. #import和#include的区别,@class代表什么?
    @class一般用于头文件中需要声明该类的某个实例变量的时候用到,在m文件中还是需要使用#import。使用@class的时候是需要用";"分号结尾的
    #import比起#include的好处就是不会引擎重复包含


    内存管理:
  5. 当你使用new / alloc / copy 方法创建一个对象时候,该对象的引用计数器值为1,当你不再使用该对象的时候,你要负责向该对象发送一条release或autorelease消息。这样,该对象将在使用寿命结束时被销毁。
  6. 当你通过任何其他的方法获取一个对象时,则假设该对象的引用计数器值为1,而且已经被设置为自动释放,你不需要执行任何操作确保该对象被清理。如果你打算在一段时间内拥有该对象,则需要保留它并在操作完成时释放它
  7. 如果保留了某个对象,你最终需要释放或自动释放该对象,必须保持retain方法和release方法的使用次数相等。
  8. 对象什么时候被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。
  9. IOS有没有垃圾回收机制? 答:Objective-C 2.0也是有垃圾回收机制的,但是只能在Mac OS X Leapard 10.5以上的版本使用。ios中是没有GC的。
  10. 内存管理autorelease 、 retain 、 copy 、 assign 、 的set方法和含义?
    你初始化(alloc / init)的对象,你需要释放(release)它
    你retain或copy的,你需要释放(release)它
  11. NSArray对象会retain任何数组中的对象。当NSArray被dealloc的时候,所有数组中的对象被执行一次释放。不仅仅是NSArray,任何搜集类(Collection Classes)都执行类似操作。例如:NSDictionary,甚至UINavigationController。




  12. 定义属性的时候:
    assign用于简单的数据类型,如NSInteger,double,bool,int等。 
    retain和copy用于对象。
    copy用于当a指向一个对象,b也想指向同样的对象的时候,如果用assign,a如果释放,再调用b会crash。如果用copy的方法,a和b有自己的内存,就可以解决这个问题
    retain会是引用计数器加1,也可以解决assign的问题
    atomic和nonatomic用人决定编译器生产的getter和setter时候为原子操作。在多线程的环境下,原子操作是必要的,否则有可以引起错误的结果。


  13. delegate和nontification的区别?分别在什么情况下使用?
    Delegate:
        消息的发送者告知接收者某个事件将要发生,delegate同意然后发送者响应事件。delegate机制使得接受者可以改变发送者的犀利哥为。通常发送者和接收的关系是直接的一对多的关系。
    Notification:
        消息的发送者告知接受者事件已经发送或者将要发送,仅此而已,接受者并不能反过来影响发送者的行为。通常发送者和接收者的关系是间接的多对多的关系。 


  14. 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就是实现方法。



  15. 类别的作用:
     有时候需要在一个已经定义好的类中增加一些方法,而不像去重写该类。可以使用类别(category)对该类就行扩充新的方法。
    注意:类别只能扩充方法,而不能扩充成员变量。要想扩充成员变量,可以使用延展。



  16. 委托:
    委托代理(delegate),顾名思义,把某个对象要做的事情委托给别的对象去做。那么别的对象就是这个对象的代理。
    委托机制是一种涉及模式。 

  17. 属性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的原子性,多线程情况下数据可能有问题

     
  18. 类变量的@protected、@private、@public、@package什么各有什么含义?
    OC对存取权限的设定,也是变量的作用域。 
    @protected:该类和所有的子类中的方法可以直接方法的变量,这是默认的。
    @private:该类中的方法可以访问,子类不可以。
    @public:除了自己和子类中的方法可以访问外,也可以被其他的类或其他的模块中的方法访问。开放性最大。
    @package:对于64位图像,这样的成员变量可以在实现这个类的图像中随意访问。


  19. 钱拷贝和深拷贝的区别?
    在有指针的情况下,浅拷贝只是增加了一个指针指向已经存在的内存,而深拷贝就是增加了一个指针并且申请了一块新的内存,使这个增加的指针指向这个新的内存,才用深拷贝的情况下,释放内存的释放就不会出现浅拷贝时重复释放同一内存的错误。



  20. 自动释放池和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的所有实例在栈中管理,并且是可以被嵌套的。

  21. timer的间隔周期准吗?为什么?怎样实现一个精准的timer?
    NSTimer可以精确到50-100毫秒
    NSTimer不是绝对准确的,而且中间耗时或柱塞错过下一个点,那么下一个点就pass过去了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值