黑马程序员技术交流社区

标题: 就业班面试题,oc基础题 1 [打印本页]

作者: 651809022    时间: 2016-3-23 17:13
标题: 就业班面试题,oc基础题 1

下面的答案有错误的和不够完整的请见谅,本帖仅供参考。

如果想要更详细的,把问题放到百度

1.OC对比C语言多了什么数据类型?
// BOOL  block


2.#include与#import的异同点是什么?
/*
import 与include的区别
1.include是在C语言中.而import是在OC中,且仅在OC中使用,而include则C与OC都可以,因为OC兼容C.
2.include并没有做重复包含优化,需要自已用条件编译与宏定义去实现.而import自已内部已经实现了.

相同点:
1.都是预处理指令
2.都是文件内容拷贝
*/

2.OC是一门什么样的语言?面向对象与面象过程的区别是什么?
//面向对象的语言  面向对象是只关心找谁去完成 面向过程是自己怎么完成每一步的过程

3.什么是类,什么是对象?
//类是具体事物的抽象  对象是该类事物实实在在的个体

4.一个类主要有哪些部分组成?
//类声明与实现


5.一个类可不可以没有声名?可不可以没有实现?
//  可以没声明  但是不能没有实现


6.类的属性又称为什么?可不可以在定义时赋值?定义时默认是多少?
//实例变量 不可以在定义时同时赋值 0

7.方法有哪两种?有什么区别?
/*

两种
类方法以 + 开头,类方法是由类名调用,类名对是象名

2 对象方法以 - 开头,对象方法是由对象调用

类方法和对象方法可以同名

*/
8.方法与函数有什么区别?

9.用什么表示对象?什么叫匿名对象?

//匿名对象:仅用来实现对象方法或者作为方法的参数时使用的对象,只能在创建时使用一次,访问类的实例变量无意义

10.内存主要分为哪几个区?对象在哪个区?
//五大区 栈区 堆区 静态区 常量区 代码区 2堆区

11.属性的作用域由什么控制?分别是什么?
// 权限控制 @public @package @private @protected

12.面向对象的三大特性是什么?
//封装  继承  多态
13.什么是继承?继承必须满足什么条件?
//  当A对象拥有B对象的所有声明 属性 与方法 而且A对象拥有独有的属性和方法 子类是父类

14.什么是组合(关联)?什么是依赖?
//  1当A对作为B对象的属性时  2当A对作为B对象的方法的参数和局部变量是

15.OC是的方法可不可重写?可不可以重载?(方法名相同,参数不同称为重载)
// 可已  不可以

16.属性能不能重写?
//    不可以

17.self与super的作用及区别?
/*

/*self的用法
self 可以在类中用来表示调用者,去调用方法.或属性.

注意: 当self调用属性时,只在对象方法中.因为类方法中不能用属性.
self调用属性,只表示类的对象.


super
表示:调用父类中的方法.

使用场合:
当子类重写父类的方法后,在某些情况下,又需要用到父类方法的功能.

注意:对象方法中只能调用父类的对象方法.类方法只能调用对象的类方法.
如果子类没有重写父类的方法,没有必要用super.用self.
所以只有在子类重写了父类方法的时候,我们调用父类方法,才要用super.
属性不能用super.因为子类不能重写父类的属性.


*/


18.什么是多态?多态的有什么作用?
//  父类的指针向了子类的对象  代码的拓展性和复用性强

19.多态要满足什么条件?
// 有继承关系  当父类指针指向子类对象时,父类必须要强转

20.多态中父类能直接访问子类独有方法及属性吗?
//  不能    必须强转

21.id指针是什么?有什么作用?
// 是OC一个指针--万能指针   用于表示任意的对象.类似于NSObject*, id本身已经封装好了一个*.不用加!!!

//可以动态调用子类的方法.调用子类独有方法时,不需要强转!

//注意:点语法除外!! 也就是id指针无法通过点语法给独有属性赋值.如果要使用,必须强转


22.id指针能使用点语法吗?能用调用子类独有方法吗?
//id指针无法通过点语法给独有属性赋值.如果要使用,必须强转.

//可以动态调用子类的方法.调用子类独有方法时,不需要强转!

23.类的本质上是什么?类的方法与属性内存的同一片区域吗?
/*
本质上还是一个对象.叫类对象.这个对象的类型:Class
类对象是在程序启动的时候加载的,与对象创建无关.
加载的标志:是load方法.

对象是在它被创建的时候加载的.且必须在类对象加载完成后才会加载.
对象加载会执行initialize方法. 只会在对象第一次创建的时候执行.

init :构造方法
构造方法是在对象被创建的时候执行的.对象每次创建都会执行.

注意:
1.一个类的实例对象被创建,则其父类的对象也会被创建.(直接或间接父类都会被创建)
2.分类的load方法不会覆盖主类的.主类与分类的load方法在程序启动的时候都会执行.
*/

24.OC中封装主要指的是什么?
  //对属性的封装
//让一个属性不能让外部直接访问,而是由我们提供set与get方法去访问.
//好处:
//提高安全性  隔离的变化  提高复用性  便于使用


25.点语法的本质是什么?用点语法访问与赋值底层做了什么操作?
// 属性的调用   编译器自动替换为set 和get

26.@property有什么作用?
//编译器启动生成 set和get 方法


27.什么时候@property不起作用?
// 当自己写出标准的set和get 方法时

28.动态类型与静态类型的区别?举例说明?
//动态类型:编译时类型不确定,运行时才检测的类型,例如: id obj = [Person new];
//静态类型:编译时已经确定的类型,例如: Person *per = [Person new];

29.构造方法有什么作用?
//是一个对象在初始化的时候执行的方法.

30.重写构造方法的好处是什么?缺点呢?
//给属性初始化时可以赋值,优点:实现简单. 不足:不能够根据不同对象赋不同的值,属性的值是固定的.

31.为什么要自定义构造方法?要注意哪些问题?
/*优点:使用灵活,可以根据不同的对象给属性设定不同的值. 不足:写法比较麻烦一些.
注意:
自定义构造方法必须以init开头.而且,第二个单词首字母必须大写.--规则!

子类继承父类自定义构造的写法.
在子类里自定义构造时,要调用父类的自定义构造,而不是NSObject的init.这样才能隔离父类的变化.
而且,父类的属性可以保持私有化private.
*/


32.OC内存管理的目的是什么?什么叫内存泄露?
// 防止内存泄露  当一个对象不在使用时,这个对象没有被销毁,空间没有释放时,这就叫内存泄露

33.OC内存管理分为哪两种?
//  手动管理 MRC   自动管理  ARC

34.MRC内存管理的目的及原则是什么?
//防止内存泄露,
//内存管理的原则:不再使用的对象必须销毁,释放内存.

35.ARC内存管理的机制是什么?
//以下添加或减少计数器值的方式,不再需要手动添加,全不能手动添加,编译器全部帮你实现.

36.内存管理的方法有哪些?这些方法能不能在ARC里使用?
//retain,release,dealloc

37.对象在释放时调用哪个方法?MAC与ARC下重写这个方法要注意什么问题?
//dealloc
38.什么叫僵尸对象?

//僵尸对象:当一个对象的引用计数变为0(MRC)或者没有被强指针指向时,其所占用的内存就会被系统回收.但是系统在没有新对象使用该空间前不会初始化该内存区域,原对象的数据信息仍会保留,通过原有的指针,可能仍可以访问到被释放对象的信息,这时候就称这个对象为"僵尸对象".对于僵尸对象,编译器并不会报错,需要在Xcode界面中设置开启僵尸对象检测

39.什么叫野指针?什么叫空指针?
//OC中的野指针就是指向僵尸对象的指针或者未赋值的指针(类似于C中的野指针)
40.什么叫强指针?什么叫弱指针?分别用什么表示?
ARC

//强指针:__strong  对象被销毁之后,指针仍然指向那片内存区域.成为野指针. (默认)

//弱指针:__weak   对象被销毁后,指针不再指向那片内存区域,成为空指针nil;

//注意:strong和weak都只能用于oc对象.非oc对象仍然用assign. 如:基本数据类型.


MRC
//强指针:retain :表示自动生成set方法的内存管理,表示会自动release旧值,retian新值 .只用于OC对象
//弱指针:assign: 不生成自动内存管理.非OC对象.(不加默认是这个)

42.@property的参数是要有哪几类?分别是什么?有什么作用?
/*

参数:
内存管理相关:
retain :表示自动生成set方法的内存管理,表示会自动release旧值,retian新值 .只用于OC对象
assign: 不生成自动内存管理.非OC对象.(不加默认是这个)
copy :表示自动生成set方法的内存管理,表示会自动release旧值,copy新值

强指针:__strong  对象被销毁之后,指针仍然指向那片内存区域.成为野指针. (默认)
弱指针:__weak   对象被销毁后,指针不再指向那片内存区域,成为空指针nil;

跟权限相关:
readonly:只读.不自动生成set方法,只生成get方法
readwrite:可读可写:自动生成set与get方法 (不加默认是这个)

跟多线程相关:
nonatomic:不同步,性能更高.--推荐
atomic:同步  性能更低. (不加默认是这个)

跟get与set方法命名相关:
getter=get方法名  表示生成你自定义的get方法名.不再是原有的以属性名命名的方法
setter=set方法名: 表示生成你自定义的set方法名.
注意这个一般不设置. BOOL型除外.



*/






作者: wx_byrDDXsc    时间: 2016-3-23 21:14

作者: chenglei2016    时间: 2016-3-23 23:16
谢谢分享,太好的资料了
作者: 332439409    时间: 2016-3-24 00:16
学习了  收藏
作者: prozwang    时间: 2016-3-24 00:20
谢谢啊!
作者: 菜逼    时间: 2016-3-24 00:35
有点多.先回复慢慢看
作者: 910428147    时间: 2016-3-24 04:14
先收藏了,基础班有学这么难吗?我看网上的视频教程没讲这么多概念啊。。。
作者: 七夜大人    时间: 2016-3-24 15:30
谢谢资料
作者: muzipiao    时间: 2016-3-24 17:22
给楼主赞个。。。。。。。。。。。。
作者: 爱尘iPhone    时间: 2016-3-24 21:28
很好的一个总结 谢谢
作者: 最爱舒儿    时间: 2016-3-25 00:08
受用了,,,,,,,,,赞一个
作者: songxuefeng    时间: 2016-3-26 00:33
赞一个,谢谢亲~~~
作者: ySssssssss    时间: 2016-3-26 20:49
感谢分享
作者: tdwydan1    时间: 2016-3-26 21:43
新接触啊
作者: x_starry    时间: 2016-3-26 22:06
没少下功夫,哥们向你学习
作者: h847941727    时间: 2016-3-26 22:12
谢谢啊!!!真的很有用




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2