首页 > 其他 > 详细

Objective-C基础知识点总结

时间:2015-11-23 21:57:55      阅读:180      评论:0      收藏:0      [点我收藏+]

一、#import 和 #include 的区别,@class代表什么?@class 和 #import 的区别?#import<> 和 #import""的区别

     答:使用上的区别:

           1>、@class 方式一般用在头文件中需要声明该类的某个实例变量的时候用到,在 .m 文件中还需要使用#import;

           2>、使用@class方式由于只需要被引用类的名称就行了,而在实现类中由于要使用被引用类中的实例变量和方法,所以需要使用#import来包含被引用类的头文件。

           作用上的区别:

          #import 会包含引用类的所有信息(内容),包括引用类的变量和方法,而 @class 仅仅是告诉编译器有这么一个类,具体这个类里面有什么信息,则完全不知。

          效率上的区别:@class方式不会出现重复编译的问题

在创建对象、继承的时候,使用#import;如果在使用时,只考虑他是一个类而不考虑其中的成员,则建议使用@class。

#import 和 #include相比起来的好处就是不会引起重复包含。#import是OC导入头文件的关键字,#include是C/C++导入头文件的关键字,使用#import头文件会自动只导入一次,不会重复导入,相当于#include 和 #pragma once。

#import<>是用来包含系统的头文件;而#import""用来包含用户头文件的。

二、Objective-C 的内存管理方式及过程

  答: 1>、当使用 new,alloc 和 copy 方法创建一个对象的时候,则该对象的保留计数器值为1;当不再使用该对象时,则要负责向该对象发送一条 release 或 autorelease 消息,这样一来,该对象在使用寿命结束时将被销毁;

       2>、当通过任何其他方法获得一个对象时,假设该对象的保留计数器值为1,而且已经被设置为自动释放,此时则不需要在执行任何操作来确保该对象被清理;但如果打算在一段时间内拥有该对象,则需要保留它并确保在操作完成时将其释放掉;

      3>、如果保留了某个对象,则需要最终释放 或 自动释放该对象,必须保持retain 方法 和 releaser 方法的使用次数相等。

三、Objective-C(以下简称OC)有私有方法吗?私有变量呢?

   答:Objective-C 类里面的方法只有两种:静态方法 和 实例方法。按照OO的原则就是一个对象只暴露其有用的东西,如果没有了私有方法,对于一些小范围的代码重用就不那么顺手了。

    在类里面声明一个私有方法:

        @interface Controller:NSObject { NSString *something;}

       +(void)thisIsAStaticMethod;

       -(void)thisIsInstanceMethod;

       @end

       @interface Controller(private)

        -(void)thisIsAPrivateMethod;

       @end

      @private可以用来修饰私有变量

      在OC中,所有实例变量默认都是私有的,所有实例方法默认都是公有的。

四、OC的类可以多重继承吗?可以实现多个接口吗?Category是什么?重写一个类的方式时是使用继承好还是使用分类好?为什么?

    答:OC的类不可以多重继承;可以实现多个接口,通过实现多个接口可以完成C++ 的多重继承;Category是指类别,一般情况使用分类较好,使用Category重写类的方法,仅对本Category有效,不会影响到其它类与原有类的关系。

五、属性readwrite、readonly、assign、retain、copy、nonatomic各是什么作用?在什么情况下使用?

   答:1>.readwrite 是可读可写特性,需要生成 getter 和 setter 方法时使用;

         2>.readonly 是只读特性,只会生成 getter 方法,不会生成 setter 方法;当不希望属性在类外发生改变时使用;

         3>.assign 是赋值特性,setter 方法将传入参数赋值给实例变量;仅在设置变量使用 assign;

         4>.retain 表示持有特性,setter 方法将传入参数先保留,再赋值,传入参数的retainCount 会 +1;

         5>.copy 表示赋值特性,setter方法将传入对象复制一份;当需要完全一份新的变量时使用;

         6>.nonatomic 是非原子操作,决定编译器生成 setter、getter是否是原子操作,atomic 表示多线程安全,一般使用nonatomic。

六、对于语句 NSString *obj = [[NSData alloc] init];obj在编译时 和 运行时分别是什么类型的对象?

     答:编译时是NSString的类型;

          运行时是NSData的类型。

七、常见的OC的数据类型有哪些?和 C 的基本数据类型有什么区别?

     答: OC 的数据类型有NSString、NSNumber、NSArray、NSMutableArray、NSData 等,这些都是class,创建后便是对象;而 C 的基本数据类型 int,只是一定字节的内存空间,用于存放数值;NSInteger 是基本数据类型,并不是NSNumber 的子类,当然也不是NSObject 的子类。NSInteger 是基本数据类型Int 或者 Long 的别名(NSInteger 的定义:typedef long NSInteger),它的区别在于,NSInteger 会根据系统是32位还是64位来决定其本身是int 还是Long。

八、id 声明的对象有什么特性?

   答:id 声明的对象具有运行时的特性,即可以指向任意类型的OC对象。

九、原子操作(atomic) 和 非原子操作(nonatomic) 属性有什么区别?

      答:1>.atomic 提供多线程安全,是防止在写操作未完成的时候被另一个线程读取,造成数据错误;

            2>.nonatomic 在自己管理内存的环境中,解析的访问器保留并自动释放返回的值,如果指定了 nonatomic,那么访问器只是简单的返回这个值。

十、内存管理的原则是什么?按照默认法则,那些关键字生成的对象需要手动释放?在和property结合时怎样有效的避免内存泄露?

    答:1>.谁申请,谁释放;

          2>.遵循 Cocoa Touch 的使用原则;

          3>.内存管理主要要避免“过早释放” 和 “内存泄露”,对于“过早释放”需要注意@property设置特性时,一定要用对特性关键字;而对于“内存泄露”,一定要申请了就要负责释放,要细心;

          4>.关键字 alloc 或 new 生成的对象需要手动释放;

           5>.设置正确的property属性,对于retain需要在合适的地方释放。

十一、OC中创建线程的方法?如果在主线程中执行代码,方法是什么?如果要延时执行代码,其方法是什么?

       答:线程的三种创建方法:NSThread、GCD的dispatch方法、子类化的NSOperation,然后将其加入NSOperationQueue;在主线程执行代码的方法是:performSelectorOnMainThread ,如果想要延时执行代码可以使用 :performSelector:onThread:withObject:waitUntilDone:

 

十二、描述iOS SDK中如何实现MVC的开发模式

      答:MVC 是模型、视图、控制器开发模式,对于iOS SDK ,所有的View都是视图层的,它应该独立于模型层,由视图控制层来控制。所有的用户数据都是模型层,它应该独立于视图。所有的ViewController都是控制层,由它负责控制视图,访问模型数据。

十三、浅复制 和 深复制的区别:

     答:浅层复制:只复制指向对象的指针,而不复制引用对象的本身。

          深层复制:复制引用对象本身。

          意思就是说我有一个A对象,复制一份后得到A_copy对象后,对于浅复制来说,A 和 A_copy指向的是同一个内存资源,复制的只不过是一个指针,对象本身资源还是只有一份,如果我们对A_copy执行了什么修改操作,则发现A引用的对象同样被修改,这其实违背了我们复制拷贝的一个思想。而深复制就是指内存中存在了两份独立的对象本身。网上有一哥们用一个通俗的例子比喻了深复制和浅复制:

    浅复制就好比是你的影子,你完蛋,你的影子也完蛋;

    深复制就好比你和你的克隆人,你完蛋,你的克隆人还活着。

十四、类别的作用?继承和类别在实现中有什么区别?

     答:1>.类别Category 可以在不获悉、不改变原来代码的情况下往里面添加新的方法,只能添加,不能删除修改;

           2>.如果类别和原来类中的方法产生名称冲突时,则类别将覆盖原来的方法,因为类别具有更高的优先级。

           3>.类别主要有三个作用:

                 (1)

 

       

 

Objective-C基础知识点总结

原文:http://www.cnblogs.com/zhufengshibei/p/4989607.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!