iOS 面试题 1

1、    简述OC中内存管理机制。与retain配对使用的方法是dealloc还是release,为什么?需要与alloc配对使用的方法是dealloc还是release,为什么?readwrite,readonly,assign,retain,copy,nonatomic 、atomic、strong、weak属性的作用?
OC使用了一种叫做引用计数的机制来管理对象,如果对一个对象使用了alloc、[Mutable]copy,retain,那么你必须使用相应的realease或者autorelease。也可以理解为自己生成的对象,自己持有。非自己生成的对象,自己也能持有。不在需要自己持有的对象时释放。非自己持有的对象无法释放。生成并持有对象<alloc,new,copy,mutableCopy等>,持有对象<retain>,释放对象<release>,废弃对象<dealloc>。

readwrite(默认):可读可写,表示既有getter方法,也有setter方法。

readonly:表示只有getter方法,没有setter方法。

nonatomic:不考虑线程安全。

atomic(默认):线程操作安全。

strong(默认):ARC下和MRC下retain一样,

weak(ARC下):和(MRC下)assign类似,区别是当weak指向的内存释放掉后自动置为nil,防止野指针。

unsafe_unretained声明一个若引用,但不会自动置为nil,可能会出现野指针。

线程安全下的setter和getter方法:

-     
(NSString *)value{

@synchronized(self){

return [[_value
retain] autorelease];

}

}

-     
(void)setValue:(NSString *)aValue{

@synchronized(self){

[aValue retain];

[_value release];

_value = aValue;

}

}

2、    类变量的@protected
,@private,@public,@package,声明各有什么含义?

上面的几个声明表明的时类成员的作用域,@private作用范围只能在自身类(外界既不可访问,又不能继承);@protected作用范围在自身类和子类,如果什么都不加修饰,默认是@protected(外界不可访问,但是可以继承);@public作用范围最大,可以在任何地方被访问(外界即可访问,又可以继承);@package作用范围在某个框架内

3、    线程是什么?进程是什么?二者有什么区别和联系?
线程是CPU独立运行和独立调度的基本单位(可以理解为一个进程中执行的代码片段),进程是资源分配的基本单位(进程是一块包含了某些资源的内存区域)。进程是线程的容器,真正完成代码执行的是线程,而进程则作为线程的执行环境。一个程序至少包含一个进程,一个进程至少包含一个线程,一个进程中的多个线程共享当前进程所拥有的资源。

4、    谈谈你对多线程开发的理解?ios中有几种实现多线程的方法?
好处:
1、使用线程可以把程序中占据时间长的任务放到后台去处理,如图片、视频的下载
2、发挥多核处理器的优势,并发执行让系统运行的更快、更流畅,用户体验更好
缺点:
1、大量的线程降低代码的可读性,
2、更多的线程需要更多的内存空间
3、当多个线程对同一个资源出现争夺的时候要注意线程安全的问题。
iOS有三种多线程编程的技术:
1、NSThread(两种创建方式)
[NSThread detachNewThreadSelector:@selector(doSomething:) toTarget:self
withObject:nil];
NSThread *myThread = [[NSThread alloc] initWithTarget:self
selector:@selector(doSomething:) object:nil];

[myThread start];
2、NSOperationQueue

NSOperationQueue *oprationQueue = [[NSOperationQueue
alloc] init];

  • oprationQueue addOperationWithBlock:^{

//这个block语句块在子线程中执行

}

http://alloc.sinaapp.com/wp/?p=237

3、Grand Central Dispatch (GCD)

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,
0), ^{

// 耗时的操作

dispatch_async(dispatch_get_main_queue(),
^{

// 更新界面

});

});

http://blog.csdn.net/totogo2010/article/details/8016129

PS:不显示的创建线程的方法:
用NSObject的类方法  performSelectorInBackground:withObject: 创建一个线程:?[Obj
performSelectorInBackground:@selector(doSomething) withObject:nil];

5、   
线程同步和异步的区别?IOS中如何实现多线程的同步?

同步:一个线程要等待上一个线程执行完之后才能执行当前的线程,生活中的例子(上厕所)。
异步:同时去做两件或者多件事。比如边听歌边看报。
原子操作(atomic)、加锁(NSLock、NSRecursive、NSConditionLock)、@synchronized    参考(http://blog.csdn.net/lifengzhong/article/details/7487505)

6、    假设有一个字符串aabcad,请写一段程序,去掉字符串中不相邻的重复字符串,即上述字符串处理之后的输出结果为:aabcd

本题的题意是以第一个出现的字母作为参照,只要之后出现相同的字母并且和第一个字母不相邻,那么就删除。为防止删除某些字符之后,把之前不相邻的重复字符串转化为相邻字符串,所以可以先用空格替换掉需要删除的字符,最后对数组里面的空格进行处理。
-(void)removeRepeat:(NSString *)aNum

{

NSMutableArray *mArr = [[NSMutableArray
alloc]initWithCapacity:10];

for (int i = 0;i < aNum.length;i++)

{

[mArr addObject:[aNum substringWithRange:NSMakeRange(i,1)]];

}

NSLog(@"- %@", mArr);

[self compareNum:mArr];

NSLog(@"%@",mArr);

}

//比较是否相等

-(NSMutableArray
*)compareNum:(NSMutableArray *)mArr

{

int count = mArr.count;//重新定义了,count不会减一

for (int j = 0; j < count - 1; j++)

{

for (int i = j; i < count - 1-1-1;
i++)

{

NSLog(@" %@  %@",[mArr objectAtIndex:j],[mArr
objectAtIndex:i + 2]);

NSString *a = [mArr
objectAtIndex:j];

NSString *b = [mArr objectAtIndex:i+2];

if ([a isEqualToString:b])

{

[mArr replaceObjectAtIndex:i +
2 withObject:@" "];

}

}

}

return mArr;

}

7、   
获取一台设备唯一标识的方法有哪些?

MAC地址,udid,keychain

参考链接<
http://www.2cto.com/kf/201308/237648.html >。

8、    iOS类是否可以多继承?如果没有,那可以用其他方法实现吗?简述实现过程。
不可以,可以通过delegate和protocol来实现类似多继承。

9、    堆和栈的区别?
栈区(stack)--由编译器自动分配释放,存放函数的参数值、局部变量的值。
堆区(heap)--一般由程序员分配释放。
全局区(静态区)(static)--全局变量和静态变量。程序结束后由系统释放。

文字常量区--常量字符串存放在这里。程序结束后由系统释放。
      程序代码区—存放函数体的二进制文件。

栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢
出。

堆:首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序,另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样,代码中的delete语句才能正确的释放本内存空间。另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。

10、  iOS本地数据存储都有哪几种方式?iOS如何实现复杂对象的存储?

1、    
NSKeyedArchiver(归档)采用归档的形式来保存数据,该数据对象需要遵守NSCoding协议,并且该对象对应的类必须提供encodeWithCoder:和initWithCoder:方法。

2、    
NSUserDefaults:用来保存应用程序设置和属性、用户保存的数据。用户再次打开程序或开机后这些数据仍然存在。NSUserDefaults可以存储的数据类型包括:NSData、NSString、NSNumber、NSDate、NSArray、NSDictionary。

3、    
Write写入方式:永久保存在磁盘中。

4、    
SQLite(FMDB、CoreData)

NSCoding
+ NSKeyedArchiver实现复杂对象的存储。

11、  iOS的动态性
iOS的动态性来自三个方面:动态类型、动态绑定、动态载入、SEL类型

1、动态类型<弱类型>(id):在代码的运行阶段判断代码的类型,使用id类型可以让应用在“运行时”使用任何类型来替换。动态类型让程序更加灵活,但是会使数据的统一性降低和代码的可读性。我们常用静态类型<强类型>(如NSString),使用静态类型编译器可以完全分析你的代码,这让代码的性能和可预知性更高。
2、动态绑定:让代码在运行时判断需要调用什么方法,而不是在编译时。 动态类型和动态绑定使得选择哪个接收者已经调用什么方法都放到运行
      时去完成。

3、动态载入:应用程序可以根据需要加载可执行代码以及资源,而不是在启动时就加载所有资源。

4、SEL类型
iOS在编译的时候会根据方法的名字(包括参数序列),生成一个用来区分这个方法的唯一的ID,这个ID是SEL类型的,SEL的本质就是类方法的编号[函数地址]。(类似C语言里面的函数指针,但是OC的类不能直接使用函数指针,这样只能做一个@selector语法来取。注意:@selector是查找当前类(含子类)的方法。)

12.写出方法获取ios内存使用情况。


// 获取当前设备可用内存及所占内存的头文件

#import <sys/sysctl.h>

#import <mach/mach.h>

// 获取当前设备可用内存(单位:MB)

- (double)availableMemory

{

vm_statistics_data_t vmStats;

mach_msg_type_number_t infoCount = HOST_VM_INFO_COUNT;

kern_return_t kernReturn = host_statistics(mach_host_self(),

HOST_VM_INFO,

(host_info_t)&vmStats,

&infoCount);

if
(kernReturn != KERN_SUCCESS) {

return NSNotFound;

}

return ((vm_page_size *vmStats.free_count) / 1024.0) / 1024.0;

}

// 获取当前任务所占用的内存(单位:MB)

- (double)usedMemory

{

task_basic_info_data_t taskInfo;

mach_msg_type_number_t infoCount = TASK_BASIC_INFO_COUNT;

kern_return_t kernReturn = task_info(mach_task_self(),

TASK_BASIC_INFO,

(task_info_t)&taskInfo,

&infoCount);

if
(kernReturn != KERN_SUCCESS

) {

return NSNotFound;

}

return taskInfo.resident_size / 1024.0 / 1024.0;}

13、        
深拷贝和浅拷贝的理解?

深拷贝拷贝的是内容,浅拷贝拷贝的是指针。深拷贝和浅拷贝最大的区别就是子类对象的地址是否改变,如果子类对象的地址改变那么就是深拷贝。

14、怎样实现一个singleton的类。
static LOSingleton * shareInstance;

+( LOSingleton *)sharedInstance{

@synchronized(self){//这个东西其实就是 一个加锁。如果self 其他线程访问,则会阻塞。这样做一般是用来对单例 进行一个死锁的保护

if (shareInstance == nil) {

shareInstance = [[super
allocWithZone:NULL] init];

}

}

return
shareInstance;

}

//第二种方式

+ (LOSingleton *) sharedInstance

{

static  LOSingleton *sharedInstance
= nil ;

static  dispatch_once_t
onceToken;  // 锁

dispatch_once (& onceToken, ^ {    
// 最多调用一次

sharedInstance = [[self  alloc]
init];

});

return  sharedInstance;

}

15、什么是安全释放?

在对象release之后把指针置为nil

16、        
RunLoop是什么?

一个RunLoop就是一个时间处理的循环,用来不停的调度工作以及处理输入时间。使用runloop的目的是让你的线程在有工作的时候忙于工作,而没工作的时候处于休眠状态。runloop的设计是为了减少cpu无谓的空转。

17、        
什么是序列化和反序列化,可以用来做什么?如何在OC中实现复杂对象的存储?

如果你需要存储一个复杂的对象的话,经常要以二进制的方法序列化这个对象,这个过程叫Archiving。如果一个对象需要进行序列化,那么需要遵循NScoding协议,主要有两个方法:
-(id)initWithCoder:(NSCoder*)coder;//从coder中读取数据,保存到相应变量中,即反序列化数据。
-(void)encodeWithCoder:(NSCoder*)coder;//读取实例变量,并把这些数据写到coder中去,即序列化数据。

18、        
写一个标准宏MIN,这个宏输入两个参数并返回较小的一个?

#define kMIN(X,Y)  ((X) 
> (Y)) ? (Y) :(X)

19、        
iphone os有没有垃圾回收机制?简单阐述一下OC内存管理。

iphone os没有垃圾回收机制。
垃圾回收机制用于在空闲时间以不定时的方式动态的回收无任何引用的对象占据的内存空间。

20、        
简述应用程序按Home键进入后台时的生命周期,以及从后台回到前台时的生命周期?

应用程序的状态:
Not running 未运行,程序没启动
Inactive    未激活,程序在前台运行,不过没接受到事件,没有事件处理的状态下通常处于这个状态。
Active      激活   程序在前台并且接收到了时间
Backgound  后台   程序在后台而且能执行代码,大多数程序进入这个状态后会在在这个状态上停留一会。
Suspended   挂起  程序在后台不能执行代码。
- (BOOL)application:(UIApplication *)application
willFinishLaunchingWithOptions:(NSDictionary *)launchOptions? 
  //告诉代理进程启动但还没进入状态保存?- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions?  // 告诉代理启动基本完成程序准备开始运行?- (void)applicationWillResignActive:(UIApplication
*)application?              // 当应用程序将要入非活动状态执行,在此期间,应用程序不接收消息或事件,比如来电话了?- (void)applicationDidBecomeActive:(UIApplication
*)application ?                                         // 
 当应用程序入活动状态执行,这个刚好跟上面那个方法相反?- (void)applicationDidEnterBackground:(UIApplication
*)application?                //  当程序被推送到后台的时候调用。所以要设置后台继续运行,则在这个函数里面设置即可?- (void)applicationWillEnterForeground:(UIApplication
*)application?                             //当程序从后台将要重新回到前台时候调用,这个刚好跟上面的那个方法相反。?- (void)applicationWillTerminate:(UIApplication
*)application?                                              //当程序将要退出是被调用,通常是用来保存数据和一些退出前的清理工作。这个需要要设置UIApplicationExitsOnSuspend的键值。?-
(void)applicationDidFinishLaunching:(UIApplication*)application?  //当程序载入后执行

21、        
ViewController
的 alloc,loadView,
viewDidLoad,viewWillAppear,viewDidUnload,dealloc、init分别是在什么时候调用的?在自定义ViewController的时候这几个函数里面应该做什么工作?

alloc初始化当前的ViewController

loadView:没有正在使用nib视图页面,子类将会创建自己的自定义视图层

viewDidLoad:试图被加载后调用

viewWillAppear:试图即将出现的时候调用

viewDidUnload:<iOS6之后废弃>当系统内存吃紧的时候会调用该方法,释放掉当前未在window中显示的试图和对应的控制器

时间: 2024-10-22 14:56:15

iOS 面试题 1的相关文章

最全的iOS面试题及答案-转载

1. Object-c的类可以多重继承么?可以实现多个接口么?Category是什么?重写一个类的方式用继承好还是分类好?为什么? 答: Object-c的类不可以多重继承:可以实现多个接口,通过实现多个接口可以完成C++的多重继承:Category是类别,一般情况用分类好,用Category去重写类的方法,仅对本Category有效,不会影响到其他类与原有类的关系. 2. #import 跟#include 又什么区别,@class呢, #import<> 跟 #import””又什么区别?

iOS面试题之加载单张图片到底会不会崩溃?

今天,一哥们去某公司面试iOS职位.其中一道题目问,加载一张图片,到底会不会崩溃呢? 我拿到这个问题,当时以为是获取网络图片,那还是可能崩溃的,但实际问题,还有半句,图片是本地的... 这问题,加载本地的怎么会崩溃呢?写这么久加载图片也没遇到如此问题. =================================================== 原来,iPhone毕竟是手持设备,它所占有的内存是有限的,当图片过大的时候会引起内存导致的崩溃现象. 后来,我又查了下,发现,原来还有这么大学

iOS面试题 第一天

今天上午,下午分别面试了两家公司.上午是一家互联网公司,气氛还比较好,是我比较喜欢的.技术这块是直接机试,主要是给了些BUG让我修复,整个过程还算顺利.下午去了一家大型的证券公司.整理技术问题如下: 1. UIView的生命周期是什么样的,执行顺序是怎么样的?init -- loadView -- viewDidLoad -- viewWillAppear -- viewWillDisappear -- viewDidUnload -- dealloc. 2. UIViewController在

iOS 面试题 总结

#include <iostream> using namespace std; int main () { char p[]={'a','b','c'}, q[]="abc"; printf("%d %d\n",sizeof(p),sizeof(q)); //getch(); } //结果 3,4 sizeof有什么作用呢? sizeof是C语言的关键字不并不是函数,这个很容易被忽略 sizeof(a)表示a在内存中所占的字节数 以下是windows

iOS 面试题:OC基本概念题

1.什么是类和对象? 类是一组具有同样特征和功能的事物的抽象 对象描写叙述了一个物体的特征和行为实现 类是对象的抽象 对象是类的实例 2.OC中定义类,创建对象,使用对象. OC中定义类分为接口部分,实现部分 接口部分:对外声明类的特征和行为 实现部分:实现方法,即类的行为实现 创建对象须要进行分配内存空间和初始 3.声明方法,依据需求.区分:方法声明,方法实现,方法运行 4.继承.继承的全部特点 子类能够继承父类全部的声明的方法和除私有的以外实例变量 父类不能使用子类所创建的方法和实例变量 5

一些iOS面试题及简要回答

1. #import 跟#include.@class有什么区别?#import<> 跟 #import""又什么区别? 1> #import和#include都能完整地包含某个文件的内容,#import能防止同一个文件被包含多次 2> @class仅仅是声明一个类名,并不会包含类的完整声明;@class还能解决循环包含的问题 3> #import <> 用来包含系统自带的文件,#import ""用来包含自定义的文件 2.

原 iOS面试题收集

原 iOS面试题收集 发表于2年前(2013-07-22 13:47)   阅读(369) | 评论(0) 4人收藏此文章, 我要收藏 赞0 听云性能监测产品App.Server.CDN免费试用,绑定账号送京东卡 iOS 面试题 Objective-C 1.ARC 是什么? ARC 是 iOS 5 推出的新功能,全称叫 ARC(Automatic Reference Counting).简单 地说,就是代码中自动加入了 retain/release,原先需要手动添加的用来处理内存管 理的引用计数

[转载]iOS面试题总

转载自:http://blog.sina.com.cn/s/blog_67eb608b0101r6xb.html (2014-06-13 20:23:33) 转载▼ 标签: 转载   crash 原文地址:iOS面试题总作者:唯一的弟子 1.简述OC中内存管理机制.与retain配对使用的方法是dealloc还是release,为什么?需要与alloc配对使用的方法是dealloc还是release,为什么?readwrite,readonly,assign,retain,copy,nonato

iOS面试题系列之Objective-C相关

1.简述你项目中常用的设计模式.它们有什么优缺点? 常用的设计模式有:代理.观察者.单例. (1)单例:它是用来限制一个类只能创建一个对象.这个对象中的属性可以存储全局共享的数据.所有的类都能访问.设置此单例中的属性数据. 优点:是它只会创建一个对象容易供外界访问,节约性能. 缺点:是一个类只有一个对象,可能造成责任过重,在一定程度上违背了"单一职责原则".单例模式中没有抽象层,所以单例类的扩展有很大的困难.不能过多创建单例,因为单例从创建到程序关闭前会一直存在,过多的单例会影响性能,

超全!iOS 面试题汇总

超全!iOS 面试题汇总 2015-10-20 CocoaChina 作者:Job_Yang 之前看了很多面试题,感觉要不是不够就是过于冗余,于是我将网上的一些面试题进行了删减和重排,现在分享给大家.(题目来源于网络,侵删) 1. Object-c的类可以多重继承么?可以实现多个接口么?Category是什么?重写一个类的方式用继承好还是分类好?为什么? 答: Object-c的类不可以多重继承;可以实现多个接口,通过实现多个接口可以完成C++的多重继承;Category是类别,一般情况用分类好