A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 佩玉鸣 中级黑马   /  2015-3-25 00:48  /  2223 人查看  /  17 人回复  /   4 人收藏 转载请遵从CC协议 禁止商业使用本文

常见的面试问题,转

1、Objective-C的类可以多重继承么?可以采用多个协议么?
答:不可以多重继承,可以采用多个协议。
2、#import和#include的区别是什么?#import<> 跟 #import""有什么区别?
#import能避免头文件被重复包含的问题:
1) 一般来说,导入objective c的头文件时用#import,包含c/c++头文件时用#include。
使用include要注意重复引用的问题:
class A,class B都引用了class C,class D若引用class A与class B,就会报重复引用的错误。
2)#import 确定一个文件只能被导入一次,这使你在递归包含中不会出现问题。
所以,#import比起#include的好处就是它避免了重复引用的问题。所以在OC中我们基本用的都是import。
#import<> 包含iOS框架类库里的类,#import""包含项目里自定义的类。

3、Category是什么?扩展一个类的方式用继承好还是类目好?为什么?
答:Category是类目。用类目好,因为继承要满足a is a b的关系,而类目只需要满足a has a b的关系,1.局限性更小,你不用定义子类就能扩展一个类的功能,2.还能将类的定义分开放在不同的源文件里, 3.用Category去重写类的方法,仅对本Category有效,不会影响到其他类与原有类的关系。

4、延展是什么?作用是什么?
答:延展(extension):在自己类的实现文件中添加类目来声明私有方法。
5、类实例(成员)变量的@protected,@private,@public声明各有什么含义?
@protected:受保护的,该实例变量只能在该类和其子类内访问,其他类内不能访问。
@private:私有的,该实例变量只能在该类内访问,其他类内不能访问。
@public:共有的,该实例变量谁都可以访问。
6、id声明的对象有什么特性?
Ø  没有 * 号
Ø  动态数据类型
Ø  可以指向任何类的对象(设置是nil),而不关心其具体类型
Ø  在运行时检查其具体类型
Ø  可以对其发送任何(存在的)消息
7、委托是什么?委托和委托方双方的property声明用什么属性?为什么?
委托:一个对象保存另外一个对象的引用,被引用的对象实现了事先确定的协议,该协议用于将引用对象中的变化通知给被引用对象。
委托和委托方双方的property声明属性都是assign而不是retain
为了避免循环引用造成的内存泄露。
      循环引用的问题这样理解:
      比如在main函数中创建了两个类的对象A和B,现在引用计数都是1。现在让A和B互相引用(A有一个属性是B对象,属性说明是retain;B有一个属性是A对象,属性说明是retain),现在两个对象的引用计数都增加了1,都变成了2。
  现在执行[A release]; [B release]; 此时创建对象的main函数已经释放了自己对对象的所有权,但是此时A和B的引用计数都还是1,因为他们互相引用了。
  这时你发现A和B将无法释放,因为要想释放A必须先释放B,在B的dealloc方法中再释放A。同理,要想释放B必须先释放A,在A的dealloc方法中再释放B。所以这两个对象将一直存在在内存中而不释放。这就是所谓的循环引用的问题。要想解决这个问题,一般的方法可以将引用的属性设置为assign,而不是retain来处理。
8、浅拷贝和深拷贝区别是什么?
      浅层复制:只复制指向对象的指针,而不复制引用对象本身。
深层复制:复制引用对象本身。
意思就是说我有个A对象,复制一份后得到A_copy对象后,对于浅复制来说,A和A_copy指向的是同一个内存资源,复制的只不过是是一个指针,对象本身资源还是只有一份,那如果我们对A_copy执行了修改操作,那么发现A引用的对象同样被修改,这其实违背了我们复制拷贝的一个思想。深复制就好理解了,内存中存在了两份独立对象本身。
用网上一哥们通俗的话将就是:
浅复制好比你和你的影子,你完蛋,你的影子也完蛋
深复制好比你和你的克隆人,你完蛋,你的克隆人还活着。
9、内存管理的几条原则是什么?按照默认法则,哪些关键字生成的对象需要手动释放?哪些情况下不需要手动释放,会直接进入自动释放池?
•      当使用new、alloc或copy方法创建一个对象时,该对象引用计数器为1。如果不需要使用该对象,可以向其发送release或autorelease消息,在其使用完毕时被销毁。
•      如果通过其他方法获取一个对象,则可以假设这个对象引用计数为1,并且被设置为autorelease,不需要对该对象进行清理,如果确实需要retain这个对象,则需要使用完毕后release。
•      如果retain了某个对象,需要release或autorelease该对象,保持retain方法和release方法使用次数相等。

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

17 个回复

倒序浏览
tzp123 来自手机 中级黑马 2015-3-25 00:53:59
沙发
楼主辛苦了,多谢分享
回复 使用道具 举报
很好, 收藏,。,,,
回复 使用道具 举报
写的很好,值得收藏。
回复 使用道具 举报
同胞们真好!
回复 使用道具 举报
楼主是个有心人,多谢分享!
回复 使用道具 举报
mark一下
回复 使用道具 举报
感谢楼主
回复 使用道具 举报
受益匪浅啊,感谢楼主的分享!
回复 使用道具 举报
楼主辛苦
回复 使用道具 举报
谢谢分享
回复 使用道具 举报
感谢楼主啊。。。赞
回复 使用道具 举报
感谢楼主
回复 使用道具 举报
谢谢,有帮助
回复 使用道具 举报
感谢分享!
回复 使用道具 举报
感谢楼主分享
回复 使用道具 举报
楼主好人啊
回复 使用道具 举报
楼主辛苦了,多谢分享
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马