ios 面试题 不定时更新

Q1、Object-C有多继承吗?没有的话用什么代替?

A:没有。多继承即一个子类可以有多个父类,它继承了多个父类的特性。多继承在Objective-C中是用protocol 和delegate来实现的。
Q2、Object-C有私有方法吗?私有变量呢?

A:Objective-C里面的方法只有两种,类方法和实例方法。所有实例变量默认都是私有的,所有实例方法默认都是公有的。
Q3、关键字const什么含义?
A:意思是只读,也就是不能在别的地方修改用该关键字修饰的变量,一般用来定义一些常量。

Q4、关键字volatile有什么含义?
A:一个定义为volatile的变量是说这变量可能会被意想不到地改变这样编译器就不会去假设这个变量的值了。精确地说就是优化器在用到 这个变量时必须每次都小心地重新读取这个变量的值而不是使用保存在寄存器里的备份。

Q5、static作用?
A:static一般有2个作用,规定作用域和存储方式。对于局部变量,static规定其为静态存储方式,每次调用的初始值为上一次调用的值,调用结束后存储空间不释放;
对于全局变量,如果以文件划分作用域的话,此变量只在当前文件可见;对于static函数也是在当前模块内函数可见。

Q6、#import和#include的区别,@class代表什么?
A:@class一般用于头文件中需要声明该类的某个实例变量的时候用到。

在m文件中还是需要使用#import 。而#import比起#include的好处就是不会引起重复包含。

Q7、线程和进程的区别?
A:进程包含一到多个线程,而且至少包含一个线程(主线程)。
进程的所有线程共享相同的资源,包括内存空间等,比如全局变量,进程的所有线程都能访问。

Q8、堆和栈的区别?
A:管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制,容易产生memory leak。
申请大小: 栈:栈是向低地址扩展的数据结构,是一块连续的内存的区域

堆:是向高地址扩展的数据结构,是不连续的内存区域。

分配方式:堆都是动态分配的 ,动态分配由alloca函数进行分配

栈的动态分配由编译器进行释放,无需我们手工实现

Q9、Object-C的内存管理?
A:1.当你使用new,alloc和copy方法创建一个对象时,该对象的保留计数器值为1。当你不再使用该对象时,你要负责向该对象发送一条release或autorelease消息。这样,该对象将在使用寿命结束时被销毁.。

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

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

Q10、为什么很多内置的类,如TableViewController的delegate的属性是assign不是retain?
A:防止出现循环引用的问题。

Q11、定义属性时,什么情况使用copy、assign、retain?
A:assign用于简单数据类型。如NSInteger,double,bool。

retain和copy用于对象。

copy用于当a指向一个对象。b也想指向同样的对象的时候,如果用assigna如果释放,再调用b会crash,如果用copy 的方式,a和b各自有自己的内存,就可以解决这个问题。

retain 会使计数器加一,也可以解决assign的问题。

另外,atomic和nonatomic用来决定编译器生成的getter和setter是否为原子操作。在多线程环境下,原子操作是必要的,否则有可能引起错误的结果。 加了atomic,setter函数会变成下面这样

 if (property != newValue)  {

 [property release];

property = [newValue retain];

}

Q12、对象是什么时候被release的?
A:引用计数为0时。

Q13、iOS有没有垃圾回收?
A:没有垃圾回收,只有系统在应用程序退出的时候会在适当的时候回收所有的东西。ios5以后有arc,可以自动添加管理内存的代码,但与垃圾回收不是一个东西。一个需要自己管理,一个不需要。

Q14、tableView的重用机制?
A: ReuseIdentifier。

Q15、ViewController 的loadView、viewDidLoad、viewDidUnload分别是什么时候调用的,在自定义ViewCointroller时在这几个函数中应该做什么工作?
A:loadView: 永远不要主动调用这个函数。view controller会在view的property被请求并且当前view值为nil时调用这个函数。如果你手动创建view,你应该重载这个函数,且 不要在重载的时候调用[super loadview]。

viewDidLoad: 这个函数的作用主要是让你可以进一步的初始化你的views。viewDidLoad通常负责的是view及其子view被加载进内存之后的数据初始化的工作,即视图的数据部分的初始化。

 viewDidUnLoad: 这个函数是viewDidLoad的对立函数。在程序内存欠缺时,这个函数被controller调用,来释放它的view以及view相关的对象。由于 controller通常保存着view以及相关object的引用,所以你必须使用这个函数来放弃这些对象的所有权以便内存回收。但不要释放那些难以重建的数据。(ios6.0以后不再使用)

viewWillAppear:视图即将可见时调用。默认情况下不执行任何操作

viewDidAppear: 视图已完全过渡到屏幕上时调用

viewWillDisappear:视图被驳回时调用,覆盖或以其他方式隐藏。默认情况下不执行任何操作

viewDidDisappear:视图被驳回后调用,覆盖或以其他方式隐藏。默认情况下不执行任何操作

didReceiveMemoryWarning:当程序内存过度时,系统会调用该方法

Q16、ViewController的didReceiveMemoryWarning是在什么时候调用的?默认的操作是什么?
A:在程序一次性申请大量内存或者申请的内存超过系统的可用内存时调用。默认操作时释放没用的view。

 View Controller会 释放他自己的 Views。

Q17、列举Cocoa中常见的集中多线程的实现,并谈谈多线程安全的几种解决办法,一般什么地方会用到多线程?
A:NSThread,NSOperation,GCD。这三种编程方式抽象度层次是从低到高的,抽象度越高的使用越简单,也是Apple最推荐使用的。

第一种方式对数据的操作要自己管理线程的生命周期和数据安全(加解锁),后两种方式只需要关心执行的操作。

Q18、怎么理解MVC,在Cocoa中MVC是怎么实现的?
A:Modal,View,Controller。

Model

描述的是你的程序是什么,有哪些数据模型。

Controller

描述你的是model如何展现在用户面前,controller控制如何在UI上展现model。

View

尽可能是view通用的,按钮,滚动条等,决不能包含任何如何去表现的逻辑。controller用这些通用的view做model想要做的事情。

Q19、delegate和notification区别,分别在什么情况下使用?
A:delegate方法往往需要关注返回值,也就是delegate方法的结果。相反的,notification最大的特色就是不关心接受者的态度,我只管把通告放出来,你接受不接受就是你的事情,同时我也不关心结果。

delegate的效率高于notification。delegate是一对一的使用,notification是一对多的使用。

Q20、id、nil代表什么?
A:id表示任意类型。

nil表示对象为空。

Q21、类别的作用?
A:在应经定义好的方法中添加方法。

Q22. c和obj-c如何混用 .

A: 1) obj-c的编译器处理后缀为m的文件时,可以识别obj-c和c的代码, 处理mm文件可以识别obj-c,c,c++代码,但cpp文件必须只能用c/c++代码,而且cpp文件include的头文件中,也不能出现obj- c的代码,因为cpp只是cpp.

2) 在mm文件中混用cpp直接使用即可,所以obj-c混cpp不是问题.

3)在cpp中混用obj- c其实就是使用obj-c编写的模块是我们想要的。如果模块以类实现,那么要按照cpp class的标准写类的定义,头文件中不能出现obj-c的东西,包括#import cocoa的。实现文件中,即类的实现代码中可以使用obj-c的东西,可以import,只是后缀是mm。如果模块以函数实现,那么头文件要按 c的格式声明函数,实现文件中,c++函数内部可以用obj-c,但后缀还是mm或m。 

总结:只要cpp文件和cpp include的文件中不包含obj-c的东西就可以用了,cpp混用obj-c的关键是使用接口,而不能直接使用实现代码,实际上cpp混用的是 obj-c编译后的o文件,这个东西其实是无差别的,所以可以用。obj-c的编译器支持cpp.



不定时更新


部分内容来源于网上,不能一一列出出处,请恕罪。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值