OC面试题

来源:互联网 发布:车库编号软件 编辑:程序博客网 时间:2024/06/05 19:05

转自:http://blog.csdn.net/ministarler/article/details/19541025?utm_source=tuicool




1
Objective-C的类可以多重继承么?可以采用多个协议么?

不可以进行多继承,可以采用多个协议。


2.委托(delegate)的声明和实现。

委托作用:传值和传事件 两类。

传值:b将自己的一个数据传送给a类,a类去展示或者处理数据。

委托传值:不暴露自己的属性就可以给自己赋值。只有想让别人给你赋值的时候才会调用。ag:(tableVIew:self.dataSOurce =  self);

传事件:a类发生了什么事,把这件事告诉关注自己的人,也就是委托的对象,让委托对象去选择的实现A的某些方法。

心得:delegate的命名要准确,尽量看名字就知道用法。delegate和通知有的用法有些象,但是前者是单对单的,后者是单对多的情况。
注意:在dealloc要把delegate至为nil,还有就是delegate设置属性的时候要用assign,不要用retain。

代码写法:

@protocol MyDelegate

- (void)doSomeThing:(NSString *)param ;

@end


@interface MyClass:NSObject<MyDelegate>

//在MyClass.m文件中实现

- (void)doSomeThing:(NSString *)param 

{

//....

}


或者

@interface MyClass:NSObject

{

  id<MyDelegate> delegate;

}


@property(assign,nonatomic)id<MyDelegate> delegate;


3.

#import#include的区别是什么?import<> #import""有什么区别?

 #import能避免头文件被重复包含的问题:

1. 一般来说,导入objective c的头文件时用#import,包含c/c++头文件时用#include

使用include要注意重复引用的问题:

class Aclass B都引用了class Cclass D若引用class Aclass B,就会报重复引用的错误。

2. #import确定一个文件只能被导入一次,这使你在递归包含中不会出现问题。

所以,#import比起#include的好处就是它避免了重复引用的问题。所以在OC中我们基本用的都是import

 

import<> 包含iOS框架类库里的类,#import""包含项目里自定义的类。

4.

Category是什么?扩展一个类的方式用继承好还是类目好?为什么?<扩展>

当一个类的方法不能够满足要求的时候,进行类扩展。

@interface ClassName (CatagoryName)

- methodName1

- methodName2

@end


@implementation ClassName(CategoryName)

//实现h文件中的方法。

-methodName1

-methodName2

@end

5、延展是什么?作用是什么?

             延展(extension:在自己类的实现文件中添加类目来声明私有方法。

就是在实现类中

添加一个私有方法,只有自己才可以使用。


6.

类实例(成员)变量的@protected ,@private,@public声明各有什么含义?

@protected:受保护的,该实例变量只能在该类和其子类内访问,其他类内不能访问。

@private:私有的,该实例变量只能在该类内访问,其他类内不能访问。

@public:共有的,该实例变量谁都可以访问。




7.

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

 没有 * 

 动态数据类型

 可以指向任何类的对象(设置是nil),而不关心其具体类型

 在运行时检查其具体类型

 可以对其发送任何(存在的)消息

8、委托是什么?委托和委托方双方的property声明用什么属性?为什么?

委托:一个对象保存另外一个对象的引用,被引用的对象实现了事先确定的协议,该协议用于将引用对象中的变化通知给被引用对象。

       委托和委托方双方的property声明属性都是assign而不是retain

为了避免循环引用造成的内存泄露。

      循环引用的问题这样理解:

      比如在main函数中创建了两个类的对象AB,现在引用计数都是1。现在让AB互相引用(A有一个属性是B对象,属性说明是retainB有一个属性是A对象,属性说明是retain),现在两个对象的引用计数都增加了1,都变成了2

  现在执行[A release]; [B release];此时创建对象的main函数已经释放了自己对对象的所有权,但是此时AB的引用计数都还是1,因为他们互相引用了。

  这时你发现AB将无法释放,因为要想释放A必须先释放B,在Bdealloc方法中再释放A。同理,要想释放B必须先释放A,在Adealloc方法中再释放B。所以这两个对象将一直存在在内存中而不释放。这就是所谓的循环引用的问题。

  要想解决这个问题,一般的方法可以将引用的属性设置为assign,而不是retain来处理。


9、

浅拷贝和深拷贝区别是什么?

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

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

意思就是说我有个A对象,复制一份后得到A_copy对象后,对于浅复制来说,AA_copy指向的是同一个内存资源,复制的只不过是是一个指针,对象本身资源还是只有一份,那如果我们对A_copy执行了修改操作,那么发现A引用的对象同样被修改,这其实违背了我们复制拷贝的一个思想。深复制就好理解了,内存中存在了两份独立对象本身。

用网上一哥们通俗的话将就是:

浅复制好比你和你的影子,你完蛋,你的影子也完蛋

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


10.

9、内存管理的几条原则是什么?按照默认法则,哪些关键字生成的对象需要手动释放?哪些情况下不需要手动释放,会直接进入自动释放池?

      当使用newalloccopy方法创建一个对象时,该对象引用计数器为1。如果不需要使用该对象,可以向其发送releaseautorelease消息,在其使用完毕时被销毁。

      如果通过其他方法获取一个对象,则可以假设这个对象引用计数为1,并且被设置为autorelease,不需要对该对象进行清理,如果确实需要retain这个对象,则需要使用完毕后release

      如果retain了某个对象,需要releaseautorelease该对象,保持retain方法和release方法使用次数相等。

 

使用newalloccopy关键字生成的对象和retain了的对象需要手动释放。设置为autorelease的对象不需要手动释放,会直接进入自动释放池。


0 0
原创粉丝点击