WXHL 学习文章连载 (十六)

本文总结了Objective-C面试中常见的知识点,包括语言特性、内存管理、类目与对象管理等内容,并对比了Objective-C与其他语言的不同之处。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

不知不觉,四个月的培训已经结束了,这几天在忙着一边做项目三,一边写简历,看面试题。。。四个月前,期待着四个月后有一个好的工作,四个月后的现在,却又要面临一个很大的挑战了。。。本想着培训以后会很好找工作的,就目前的情况看来,还不是想象中那么容易的。。。好好准备吧 ,争取早日找到合适的工作。。。。。。。


面试知识点:


1.OC语⾔言的基本特点!OC语⾔言是C语⾔言的⼀一个超集,只是在C的基础之上加上了⾯面向对象(oo)的特性;!
OC与Java语⾔言相同都是单继承,这⼀一点与C++语⾔言不同(多重继承);!OC不⽀支持命名空间机制,取⽽而代之的是在类名之前添加前缀,以此来区分。!!
2.#include与#import的区别、#import与@class的区别!
(1) #include与#import的区别:#include和#import其效果相同,只是后者不会引起交叉编译,确保头⽂文件只会被导⼊入⼀一次。!
(2) #import与@class的区别: import会包含这个类的所有信息,包括实体变量和⽅方法,⽽而@class只是告诉编译器,其后⾯面声明的名称是类的名称,⾄至于这些类是如何定义的,暂时不⽤用考虑,后⾯面会再告诉你。使⽤用#import编译效率⾼高,防⽌止相互包含的编译错误!!
3.简述类⺫⽬目优点和缺点,如果覆盖本类或者⽗父类的⽅方法,会
出现什么问题?!(1)优点:不需要通过增加⼦子类⽽而增加现有类的⾏行为(⽅方法),且类⺫⽬目中的⽅方法与原始类⽅方
法基本没有区别!(2)缺点:⽆无法向类⺫⽬目添加实例变量。覆盖原始类⽅方法后,原始类的⽅方法没办法调⽤用!
4.简述内存管理基本原则!如果使⽤用alloc、copy(mutableCopy)或者retian⼀一个对象时,你就有义务,向它发送⼀一条release或者autorelease消息。其他⽅方法创建的对象,不需要由你来管理内存。!
5. 什么是ARC技术?与GC是否相同?!
ARC是Automatic Reference Counting的简称,我们称之为⾃自动引⽤用计数,是iOS5.0之后推出的内存管理的新特性。本质上还是使⽤用引⽤用计数来管理对象,只是我们在编写代码时,不需要向对象发送release或者autorelease⽅方法,也不可以调⽤用delloc⽅方法,编译器会在合适的位置⾃自动给⽤用户⽣生成release消息(autorelease)。GC的全称是garbage collection,内存垃圾回收机制,ARC⽐比GC性能好!!
!
6.iOS中是否⽀支持垃圾回收机制!iOS开发只⽀支持⼿手动内存管理与ARC,Mac开发⽀支持GC垃圾回收机制,10.8之后弃⽤用了
GC,推荐使⽤用ARC。!!
7.深、浅复制的基本概念以及他们的区别!
浅复制:只复制对象本⾝身,不对⾥里⾯面的属性复制!深复制:不仅复制对象本⾝身,对象持有的属性对象也做复制!
!
!
!
!
8.内存中的堆区和栈区的差别!
栈区(stack)由编译器⾃自动分配释放 ,存放⽅方法(函数)的参数值,局部变量的值等,堆
区(heap)⼀一般由程序员分配与释放, 若程序员不释放,则内存溢出!!
9.⽤用户⾃自定义了⼀一个对象,如何实现拷⻉贝(可变和不可变拷
⻉贝)!必须实现copying和mutableCopying协议,表⽰示返回⼀一个不可变和可变的对象。否则,程序
将会出现异常。!
- (id)copyWithZone:(NSZone *)zone!{!
! Person *person = [[self Class] allocWithZone:zone];!
! person ->age = self.age;!
! person ->name = self.name;!
! return person;!
}!
- (id)mutableCopyWithZone(NSZone *)zone;!!
10.定义属性时,什么时候⽤用assign、retain、copy、nonatomic!
(1)assign:普通赋值,⼀一般常⽤用于基本数据类型,常⻅见委托设计模式,以此来防⽌止循环引⽤用。!
(2)retain:保留计数,获得到了对象的所有权。引⽤用计数在原有基础上加1。!(3)⽤用来复制对象,⼀一般字符串使⽤用copy,Foundation中的不可变对象使⽤用copy效果相当于retain, 只是引⽤用计数+1!
(4) nonatomic,⾮非原⼦子性访问,不加同步,多线程并发访问会提⾼高性能!!
11. strong与weak,_unsafe_unretained与weak的区别!(1)strong叫强引⽤用,weak叫弱引⽤用,在ARC中,使⽤用strong告诉编译器帮助我们⾃自动插⼊入
retain,weak是普通赋值相当于⼿手动管理内存的assign,!(2)_unsafe_unretained与weak功能⼀一致,区别在于当指向的对象销毁后,weak会将变量置为nil,防⽌止调⽤用野指针。!
12.ARC存在内存泄露吗!ARC中如果内存管理不当的话,同样会存在内存泄露,例如:ARC中也会循环引⽤用导致内
存泄露,OC对象与CoreFoundation类之间桥接时,管理不当也会产⽣生内存泄露!!
13.当我们释放对象时,为什么需要调⽤用[super dealloc]⽅方
法?!因为,⼦子类是继承⾃自⽗父类,那么⼦子类中有⼀一些实例变量(对象),是继承⼦子⽗父类的,因此,我们需要调⽤用⽗父类⽅方法,将⽗父类所拥有的实例进⾏行释放。!
!
!
14.⾃自动释放池是什么,如何⼯工作!⾃自动释放池是NSAutorelease类的⼀一个实例,当向⼀一个对象发送autorelease消息时,该对象
会⾃自动⼊入池,待池销毁时,将会向池中所有对象发送⼀一条release消息,释放对象!!
15.为什么delegate(代理)属性都是assign⽽而不是retain
的?!防⽌止循环引⽤用,以⾄至对象⽆无法得到正确的释放!!
16.iOS开发中数据持久性,有哪⼏几种!plist⽂文件写⼊入、对象归档、sqlite3数据库、coredata!
!17.什么是KVC和KVO?以及它们之间的关系是什么!
(1)KVC(键值编码)是⼀一种间接访问对象实例变量的机制,该机制可以不通过存取⽅方法就可以访问对象的实例变量!(2)KVO(键值观察)是⼀一种能使得对象获取到其他对象属性变化的通知机制。!(3)实现KVO键值观察模式,被观察的对象必须使⽤用KVC键值编码来修改它的实例变量,这样才能被观察者观察到。因此,KVC是KVO的基础或者说KVO的实现是建⽴立在KVC的基础之上的。!
!18. 简述常⻅见的设计模式!单例设计、代理设计、观察者(通知)、⼯工⼚厂⽅方法、模版⽅方法、!
!
19. 内存管理 在dealloc放发中 ⽤用release⽅方法号还是⽤用self.xxx = nil 好;!
使⽤用self.xxx=nil更好,因为先调⽤用了release⽅方法,⽽而且还将变量设置为nil,这样就更安全的释放对象,防⽌止野指针调⽤用!
!
20.线程与进程的区别和联系? !
⼀一般的应⽤用程序是单个进程,也有多进程(⾕谷歌浏览器),进程是个静态的容器,⾥里⾯面容纳了很多个线程,线程是⼀一系列⽅方法的线性执⾏行路径。!
!
21.OC语⾔言的优缺点!(1)优点:类⺫⽬目、动态识别、⽀支持C语⾔言、OC与C++可以混编!
(2)缺点:不⽀支持命名空间、不⽀支持运算符重载、不⽀支持多重继承!!
22.代理delegate与通知Notification、block的使⽤用区别!delegate与block⼀一般是⽤用于两个对象1对1之间的通信交互,delegate需要定义协议⽅方法,代
理对象实现协议⽅方法,并且需要建⽴立代理关系才可以实现通信。block更加简洁,不需要定义繁琐的协议⽅方法,但是如果通信事件⽐比较多的话,建议使⽤用delegate。Notification主要⽤用于1对多情况下通信,⽽而且,通信对象之家不需要建⽴立关系!但是使⽤用通知,代码可读性差!!
23.控制器ViewController 的 loadView, viewDidLoad, !
viewDidUnload 分别是在什么时候调⽤用的?!(1)loadView调⽤用:当控制器的根视图view为空,且此view被访问时则调⽤用!
(2)loadView调⽤用之后调⽤用viewDidLoad!(3)iOS6.0之前,当内存警告时,先卸载视图,再调⽤用viewDidUnload来释放内存!!
24.@synthesize与@dynamic的区别!(1)@synthesize 是系统⾃自动⽣生成getter和setter属性声明!
(2) @dynamic的意思是告诉编译器,属性的获取与赋值⽅方法由⽤用户⾃自⼰己实现, 不⾃自动⽣生成。!!
25.事件响应者链的概念!响应者链表⽰示⼀一系列的响应者对象。事件被交由第⼀一响应者对象处理,如果第⼀一响应者不处理,事件被沿着响应者链向上传递,交给下⼀一个响应者(next responder)。⼀一般来说,第⼀一响应者是个视图对象或者其⼦子类对象,当其被触摸后事件被交由它处理,如果它不处理,事件就会被传递给它的视图控制器对象(如果存在),然后是它的⽗父视图(superview)对象(如果存在),以此类推,直到顶层视图。接下来会沿着顶层视图(top view)到窗⼝口(UIWindow对象)再到程序(UIApplication对象)。如果整个过程都没有响应这个事件,该事件就被丢弃。⼀一般情况下,在响应者链中只要由对象处理事件,事件就停⽌止传递。但有时候可以在视图的响应⽅方法中根据⼀一些条件判断来决定是否需要继续传递事件。!
!
26.线程与进程的区别!
27.C语⾔言中static变量和static函数有什么作⽤用!(1)表⽰示变量是静态存储变量,表⽰示变量存放在静态存储区!
(2)加在函数前⾯面的时候表⽰示该函数是内部连接,只在本⽂文件中有效,别的⽂文件中不能应⽤用该函数.!
!
28.指针题!
a) int a; // ⼀一个数值!
b) int *a; // ⼀一个指向数值的指针!
c) int **a; // ⼀一个指向指针的指针!
d) int a[10]; //⼀一个有10个指针的数组,该指针是指向⼀一个整型数的。 !
e) int *a[10]; //⼀一个有10个指针的数组,该指针是指向⼀一个整型数的。 !
f) int (*a)[10]; //⼀一个指向有10个整型数数组的指针 !
g) int (*a)(int); //⼀一个指向函数的指针,该函数有⼀一个整型参数并返回⼀一个整型数。 !
h) int (*a[10])(int); //⼀一个有10个指针的数组,该指针指向⼀一个函数,该函数有⼀一个整型参数并返回⼀一个整型数。 !
!
29.写⼀一个NSString类的实现!
+ (id)initWithCString:(const char *)nullTerminatedCString encoding:
(NSStringEncoding)encoding{!
! NSString *obj;!
! obj = [self allocWithZone: NSDefaultMallocZone()];!
! obj = [obj initWIthCString: nullTerminatedCString encoding: encoding];!
! return AUTORELEASE(obj);!}!
!
30.c和obj-c如何混⽤用,C++和obj-c呢!实现⽂文件的扩展名.m改成.mm即可!但cpp⽂文件必须只能⽤用c/c++代码,⽽而且cpp⽂文件include
的头⽂文件中,也不能出现obj-c的代码,因为cpp只能写C++的代码!!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值