IOS学习之——面试问题集锦



1.C语言有多少个关键字?   32
2.变量与常量的区别是什么?
//   变量可变 存在栈区 常量不可变  常量区

3.变量的命名遵循什么原则?
//   大小写 字母  数字 下划线 美元符 驼峰命名法,不能以数字开头

4.c语言有哪五大数据类型?
//   基本类型 空类型  结构类型 自定义类型

5.常见的运算有哪些?
//   数术 逻辑  关系 赋值

6.逻辑运算有哪几种?判断原则是什么?
// 逻辑与 &&   逻辑或||  逻辑非 !

7.存在多个运算符时,运算顺序由什么决定的?
//  先算高级运算 同等级 从左往右

8.计算机存储的数据本质上是什么?
//  二进制

9.流程控制有哪几种?
//顺序   判断   循环

10.选择结构有哪几种?
//if, if(){}else if(){}

11.switch语句如果case里没有break的执行流程是什么?
// 穿透

12.循环结构有哪些?
// while for do-while

13.什么时候适合用for什么时候适用用while?
//   当知道循环次数是  用for   当不知道次数是用  while

14.forwhile能不能相互转换?
//   for 循环 可以转换  while  while 不一定能转换for

15.do whilewhile的区别是什么?
// do while 至少会执行一次

16.continuebreak的作用及区别是什么?
//  continue 是跳出本次循环 循环会继续执行 break 结束循环

17.什么是进制?
//  进制就给计算机识别的

18.计算机中常见的进制是有哪些?怎么表示?
// 二    八  O  十   十六   OX 进制

19.2进制有2吗?16进制每位最大是多少?
// 没有  F

20.常见的位运算有哪几种?判断逻辑是什么?
//与  或  异或  取反

21.函数可以分为哪几类?使用步骤是什么?
// 无参无返回值 无参有返回值  有参无返回值  有参有返回值  先声明 再调用

22.函数的作用域是什么?

23.函数声明的作用是什么?可以没有声名吗?
// 告诉编译器  可以在 主函数前面 没声明

24.函数的参数会开辟空间吗?
//  会

25.函数的参数传递的是实际是什么?
// 值传递   是把实参值传给形参

26.如果用函数改变一个局部变量的值?

27.什么是数组?什么时候用数组?
//数组是把相关相同的数据集合在一起  当要把相同的数据集合在一起的时候

28.数组常见的排序算法有哪些?
//冒泡排序  选择排序  快排

29.数组的元素的个数可以改变吗?
// 不可以

30.定义数组时可不可以不写长度?什么时候必须写长度?
// 当一维数组 定义同时赋值时不用  定义不赋值的时候

31.数组批量赋值要注意什么问题?什么情况下才可以批量赋值?
//  要注意数组长度   定义同时一起赋值

32.指针是什么?
//   指针是指 装地址的一个储存空间

33.指针可以进行什么运算?
//    加减运算 赋值

34.指针加1或减一时移动的字节数由什么决定?
// 是由当前的指针类型决定
35.如何确定一个指针的类型?

36.如何给一个数据类型定义指针?

37.什么叫野指针?
//   当定义一个指针没初始化,使用指针

38.什么叫常量指针?什么叫指针常量?

39.数组名代表什么?什么叫指针数组?什么叫数组的指针?
//代表数组的第一个元素首地址 指针数组是数组的每个元素

// 都是装指针的,数组的指针是指数组的首地址

40.C语言字符串有哪几种定义方式?各有什么区别?
// 两种 字符数组每个元素代表一个字符 有\0  字符串数组 系统默认加\0

41.什么叫结构体?
//是几个不同数据的集合


42.结构体的内存分配原则是什么?
// 在足够的储存的情况下 巡址是从高到低,结构体的数据类型所占的字节数是当前的最大数据类型 的整数倍

43.结构体名含有首元素的地址吗?
// 没有

44.枚举是什么?有什么作用?
//是一种数据类型 是把多个整形常量以自定义的形式封装成一个整体

45.typedef有什么作用?
// 是给数据类型 起别名

46.C预处理指令是什么?有哪几类?
/* 宏定义:#define 代码替换,为了出现符号的优先级,替换后的代码加(),
头文件包含:#inclde  文件复制,会把整个文件内容复制;
 条件编译:#if #else  给定条件为真,则编译下面代码
*/
47.防止重复包含与交叉包含的方法是什么?

48.staticextern的区别是什么?
49.文件操作的步骤是什么?
// 打开文件 操作文件  关闭文件指针


50.文件操作的输入与输出怎么区分?是相对于什么而言?

OC 部分

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.selfsuper的作用及区别?
/*

 /*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型除外.



*/


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

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

43.什么问题是ARC模式解决不了的?MRC与ARC如何解决循环引用的问题?
// 循环引用循环引用: 概念: 一个对象引了另一个对象, 而另一个对象中同样引用了这个对象.两个对象互相引用.

//MRC:一个retian 一个用assgin

//ARC:一个用strong 一个用week

44.@autoreleasepool有什么作用?
/*
作用:会把池内调用过autorelease的对象全部release一次.注意:是在这个池销毁的时候.
不足:控制不灵活,只能等释放池销毁才会release.
注意:不要把大对象放在这里auturelease.占用内存大的对象要手动release,在对象用完之后.

*/

45.autorelease的作用是什么?要注意什么样的问题?与release区别是什么?
/*
作用:把对象放到一个自动释放池里,则对象会被自动回收.
因为自动释放池销毁时会让对象调用release方法.
用法:
直接让对象创建后,调用一次autorelease方法.
这个方法会返回对象本身.

好处:
不用关心对象在什么时候释放.

注意:
1.不能再调用autorelease方法后,再调用release.
2.不能重复调用autorelease
*/

44.@class与#import有什么区别?
//  @class 只会告诉编译器,这里要用到的是一个类,但是这个类里的属性与方法不知道,

//#import是会把整个头文件拷贝到当前文件,则这个类以及这个类的属性与方法都知道.

//@class不需要拷贝文件内容,执行效率更高.我们只需要在需要有到这个对象里的属性或方法时,再去导入头文件即可.(推荐)

//#import只要导入,就会拷贝,不管这个文件是否要用到对象属性或方法.效率更低,同时,只要头文件改动,全部需要重新拷贝,编译.



45.分类Category是什么?有什么作用?
/*
好处:
1.可以把一个类分模块,便于协同开发,并优化类的结构.
2.不改变类名,给类添加功能.


注意的问题:
1.分类不能写(添加)属性.只能(添加)写方法.
2.分类中的方法不能与主类或其它分类重复.即不能重写.如果重写了,那么会覆盖原来的方法.
3.分类中可以直接用主类的属性,但是属性的权限要>=@protected
4.不同分类中重写了同一个方法.那么哪个分类最后编译,则哪个分类的方法执行.
5.主类永远在分类之前编译
编译顺序: 父类-->主类-->分类(多个分类是可以调整顺序的)
*/

46.分类与子类的相同点和区别是什么?

47.协议是什么?有什么作用?
//协议就是一系列方法的列表.也是用来遵守的.如果一个类遵守了一份协议,就表示这个类拥有了这个协议里的所有方法.

48.协议中能定义属性吗?协议中有方法的实现吗?
//不能定义属性, 只有方法的声明 没有实现

49.协议中的方法一定要实现?通过什么来控制方法是否一定要实现?
//不一定要全部实现 取决于关键字 @optional: 不一定要实现  @required:  一定要实现

50.协议可以多遵守吗?可以协议遵守协议吗?
//可以多遵守协议  可以协议遵守协议

51.协议限定对象类型指的是什么?代码怎么体现?
//id 指针   id<ProtocolTest> ns

52.什么叫OC的代理模式?实现步骤是什么?
/*
 1.找代理对象去帮我们做事情.
 2.当一个对象A希望在做某些事情的时候,告诉另一个对象B.--可以让B成为A代理.
 3.当一个对象B希望另一人对象A在做完某些事情时,自已能知道.----可以让B成为A的代理.

 定义:
 1.分析需求,看实现需求需要哪些行为.
 2.定义协议:把这些行为声名在协议中.
 3.定义需求类,在类中定义一个id属性,让这个id属性去遵守这个协议.(限定这个id指向的对象类型)
 4.定义一个实现需求的方法声名在类中.
 5.在类的实现里去实现这个需求.
 6.在这个方法的具体实现中调用id属性去动态调用对应的方法.去实现具体需求.

 使用:
 1.让一个类去遵守这个协议.
 2.同时实现这个协议里的所有方法.
 3.创建这个类的对象.以及需求类的对象,赋值给需求类的id指针.
 4.让需求类的对象调用自已实现需求的方法.(真实处理需求的是代理对象).




 */


53.block是什么?与函数有什么区别?
//作用:对代码的封装,可以在程序运行时动态封装调用.效率很高.

54.block能访问外部变量吗?能直接修改吗?怎么样才能?
//能访问外部变量 变量只有加了__block才能在block内部改变.默认不能改变外部的值,只能只读.

55.block可以当做哪些成分?要注意什么问题?


56.Foundation框架主要分为哪几大类?

//结构体 集合  字符串  字典 NSDate NSValue NSNumber 拷贝 description

57.结构体主要分为哪几大类?各有什么作用?
//  NSRange 范围  NSPoint 坐标(X,Y) NSSize 宽高 W H  NSRect 矩形 ( X,Y,W,H)

58.字符串主要分为哪两类?有什么区别?
// NSArray 不可变字符串:长度不可变 ;NSMutadleArray

//可变字符串,长度可变  NSMutadleArray 是NSArray  的子类

59.字符串主要有几种创建方式?
// 普通创建   动态创建  通过C语言字符串创建,将C语言字符串,转换成了OC字符串

// 从文件中读取创建  从URL读取.URL:

60.字符串输出的方法主要有哪几种?
// 把字符串输出到一个文件中 把字符串输出到一个 资源对象中(URL)

61.可变字符串常见操作有哪些?
// 1增加:在后面增加 2减少:在删除一定范围的字符串

// 3替换:把某一个范围内的字符串替换成别的字符串

62.字符串常见用法有哪些?
// 1 把字符串的所有的字符变成大写 ,2 把字符串的所有字符串的字符变成小写,

//  3追加:重新生成一个字符  4 两个字符串的比较大小 ;是否相等  5 截取;

63.集合框架是要有哪三类?
//  NSArray  NSSet NSDictiongary

64.Array集合是什么?分为哪两类?
// NSArray NSMutableArray

65.Array集合常见操作有哪些?
// 取值  遍历集合

66.Set集合是什么?分为哪两类?
// 无序 的集合  NSSet  NSMutableSet

67.Set集合常见操作有哪些?
// 取值  遍历集合

68.Array与set集合是区别是什么?
//  NSArray 是一个有序的集合 可以遍历取出每一个值

//  NSSet是一个无序的集合  遍历只能随机取出一个值

69.字典是什么?主要有哪两类?
// 1 键值对   2 NSDictionary NSMutableDictionary


70.字典的常见操作有哪些?
// 创建  遍历取值  NSMutableDictiongary 可以增加 删除 修改

71.字典的key值能相同吗?value值呢?
// 不能   可以

72.NSNumber的主要作用是什么?
// 1把基本数据类型包成OC对象 2把OC对象拆成基本数据类型

73.NSValue的主要作用是什么?
// 1把结构体包装成OC对象   2把OC对象拆成 结构体

75.NSDate的主要作用是什么?
//  1获取当前时间,或者获取任意一个时间节点,并封装成对象

//  2把一个字符串的时间转换成NSDate的对象

//   3 把NSDate对象转换成对应格式的字符串

76.description的作用是什么?
// 1判断一个对象是否是一个类或者子类的对象 ,不包含父类

//  2判断一个对象是否是一个类的对象(实例) 不包含子类
78.copy的作用是什么?
// 拷贝数据

79.深复制与浅复制有什么区别?
//1.深复制:就是表示拷贝一个对象去生成一个新对象.也就是新对象与之前对象占用不同的空间,但内容一致.
//2.浅复制:就是表示拷贝一个对象指针对生成一个新的指针.这两个指针指向同一个对象.

80.可变字符串与不可变字符串,可变集合与不可以变集合深复制与浅复制的区别?



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值