iOS面试题总结

2021年11月22日 阅读数:10
这篇文章主要向大家介绍iOS面试题总结,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。



iOS面试题总


 



做者:​惟一的弟子ios



1.简述OC中内存管理机制。与retain配对使用的方法是dealloc仍是release,为何?须要与alloc配对使用的方法是dealloc仍是release,为何?readwrite,readonly,assign,retain,copy,nonatomic,atomic,strong,weak属性的做用? 面试

 


答:OC中内存管理机制应该就是引用计数的增减吧,retainCount为0时释放该内存。数据库


      retain对应的是release,内存的释放用release。json


      alloc对应的是dealloc,内存的销毁用dealloc。设计模式


      readwrite此标记说明属性会被当成读写的,这也是默认属性。数组


      readonly此标记说明属性只能够读,也就是不能设置,能够获取。缓存


      assign不会使引用计数加1,也就是直接赋值。安全


      retain会使引用计数加1。性能优化


      copy创建一个索引计数为1的对象,在赋值时使用传入值的一份拷贝。网络


      nonatomic:非原子性访问,多线程并发访问会提升性能。


      atomic:原子性访问。


      strong:打开ARC时才会使用,至关于retain。


      weak:打开ARC时才会使用,至关于assign,能够把对应的指针变量置为nil。


 


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


 


答:@protected 该类和全部子类中的方法能够直接访问这样的变量。


      @private 该类中的方法能够访问,子类不能够访问。


      @public   能够被全部的类访问


      @package 本包内使用,跨包不能够


 


3.线程是什么?进程是什么?两者有什么区别和联系?


 


答:线程,有时称为轻量级进程,是被系统独立调度和CPU的基本运行单位。


       进程是操做系统中能够并行工做的基本单位。


      一个应用程序里至少有一个进程,一个进程里至少有一个线程。


   


4.谈谈你对多线程开发的理解?iOS中有几种实现多线程的方法?


 


答:在一个进程中有多个线程,每一个线程有本身单独的任务


优势效率快   缺点不安全,耗费资源


      有三种


      第一种,使用@synchronized(self)


      第二种,使用GCD


      第三种,使用NSOperationQueue


 


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


 


答:一个进程启动的多个不相干线程,它们相互之间关系为异步。



同步的话指的是多线程同时操做一个数据 这个时候须要对数据添加保护 这个保护就是线程的同步。
用GCD中的串行队列来解释多线程的同步,也就是队列中的任务为串行,它们各自对相邻的任务有依赖性,若是任务1不完成,那么任务2就不会开始,这就是同步
6.假设有一个字符串aabcad,请写一段程序,去掉字符串中不相邻的重复字符串,既上述字符串处理以后的输出结果为:aabcd
答:
NSMutableString *str = [[NSMutableString alloc]initWithFormat:@"aabcad"];
NSMutableArray *marry = [[NSMutableArray alloc]init];


    for (int i = 0; i < str.length - 1; i++) {

        unsigned char a = [str characterAtIndex:i];

        for (int j = i + 1; j < str.length; j++) {

            unsigned char b = [str characterAtIndex:j];

            if (a == b) {

                if (j == i + 1) {

 

                }else{

   

               [marry addObject:[NSString stringWithFormat:@"%d",j]];

                }

            }

        }

        }

for (int i = marry.count - 1; i > 0; i--) {

        

        NSInteger num = [[marry objectAtIndex:i]intValue];

        [str deleteCharactersInRange:NSMakeRange(num, 1)];

 

    }

 

7.获取一台设备惟一标示的方法有哪些?
答:1.UDID
2.UUID
3.MAC ADDRESS
4.OPEN UDID  
5.广告标识符
6.Vindor标示符
ios7以后用的时keychain(钥匙串)
8.ios类是否能够多继承?若是没有,那能够用其余方法实现吗?简述实现过程。
答:没有    用catogory、extension来实现   实现过程我会在ios复习中提到
9.堆和栈的区别?
答:堆须要用户手动释放内存,而栈则是编译器自动释放内存
10.ios本地数据存储都有哪几种方式?
答:1.  NSKeyedArchiver(加密形式)

       2.  NSUserDefaults

       3.  Write写入方式

       4.  SQLite3

11.写出方法获取ios内存使用状况。
答:
12.深拷贝和浅拷贝的理解?
答:对一个实例进行深拷贝时当前类须要实现NSCopying协议。
浅拷贝是复制出来一个跟原对象是同一地址的对象,而深拷贝则是复制出来一个跟源对象不一样地址的对象,改变原对象,对新对象没有影响。
13.怎样实现一个singleton的类。
答:单例  在复习中也有提到
14.什么是安全释放?
答:把对象指针置为nil,再对其释放。
15.RunLoop是什么?
答:
16.什么是序列化和反序列化,能够用来作什么?如何在OC中实现复杂对象的存储?
答:把对象转换为字节序列的过程称为对象的序列化
把字节序列恢复为对象的过程称为对象的反序列化
将对象写到文件或者数据库里,而且能够读取出来
遵循NSCoding协议,来实现复杂对象的存储
实现该协议后就能够对其进行打包或者解包,而后转化为NSData
17.写一个标准宏MIN,这个宏输入两个参数并返回较小的一个?
答:#define MIN((A),(B)) ((A(A:B))
延展问题:写宏的时候要注意些什么问题呢?
函数宏后面的参数都要用括号单独括起来,函数名大写
#define A 20
18.iphone os 有没有垃圾回收机制?简单阐述一下OC内存管理。
答:没有垃圾回收   内存管理同1题
19.简述应用程序按Home键进入后台时的生命周期,以及从后台回到前台时的生命周期?
答:前者进行的方法有
- (void)applicationWillResignActive:(UIApplication *)application
- (void)applicationDidEnterBackground:(UIApplication *)application
后者进行的方法有
- (void)applicationWillEnterForeground:(UIApplication *)application
- (void)applicationWillResignActive:(UIApplication *)application
20.ViewController 的 alloc,loadView,ViewDidLoad,ViewWillAppear,ViewDidUnload,dealloc,init分别是在何时调用的?在自定义ViewController的时候这几个函数里面应该作什么工做?
答:alloc申请内存时调用
loadView加载视图时调用
ViewDidLoad视图已经加载后调用
ViewWillAppear视图将要出现时调用
ViewDidUnload视图已经加载但没有加载出来调用
dealloc销毁该视图时调用
init视图初始化时候调用
21.描述应用程序的启动顺序。
答:
1. 程序入口main函数建立UIApplication实例和UIApplication代理实例。


2. 在UIApplication代理实例中重写启动方法,设置根ViewController。

3. 在第一ViewController中添加控件,实现应用程序界面。

22.为何不少内置类如UITableViewControl的delegate属性都是assign而不是retain?请举例说明。
答:
避免循环引用
好比:对象A建立并引用到了对象B,对象B建立并引用到了对象C,对象C建立并引用到了对象B,这个时候B的引用计数是2,而C的引用计数是1,当A不用B的时候,就释放了B的全部权,这个时候C还引用对象B,全部B不会释放,引用计数为1;由于B也引用着对象C,B不释放,那么C就不会被释放,全部它们的引用计数都为1,而且永远不会被释放,因此造成了循环引用。
23.使用UITableView时候必需要实现的几种方法?
答:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
24.写一个便利构造器。
答:
- (id)studentWithName:(NSString *)name andAge:(NSInter)age{
MyView *view = [[MyView alloc]initWithName:name andAge:age];
return [view autorelease];
}
25.UIImage初始化一张图片有几种方法?简述各自的优缺点。
答:
3种
imageNamed:系统会先检查系统缓存中是否有该名字的Image,若是有的话,则直接返回,若是没有,则先加载图像到缓存,而后再返回。
initWithContentsOfFile:系统不会检查系统缓存,而直接从文件系统中加载并返回。
imageWithCGImage:scale:orientation 当scale=1的时候图像为原始大小,orientation制定绘制图像的方向。
1.回答person的retainCount值,并解释为何?
Person *per = [[Person alloc]init];
self.person = per;
答:1或者2,alloc+1,assign+0,retain+1
2.这段代码有什么问题吗?
@implementation Person
-(void)setAge:(int)newAge{self.age = newAge;}


@end


 


答:死循环


 


3.这段代码有什么问题,如何修改


for(int i = 0;i


NSString *string = @"Abc";


string = [string lowercaseString];


string = [string stringByAppendingString:@"xyz"];


NSLog(@"%@",string);


}


答:在循环里加入自动释放池@autoreleasepool{};


 


4.截取字符串"20 | http://www.baidu.com"中,"|"字符前面和后面的数据,分别输出它们。


答:[string componentsSeparatedByString:@"|"]


 


5.用obj-c写一个冒泡程序。


答:



    NSMutableArray *array = [NSMutableArray arrayWithObjects:@"15",@"12",@"5",@"8", nil];

    for (int i = 0; i < array.count - 1; i++) {

        int a = [array[i]intValue];

        for (int j = i + 1; j < array.count; j++) {

            int b = [array[j]intValue];

            if (a < b) {

                [array exchangeObjectAtIndex:i withObjectAtIndex:j];

            }

        }

    }

    for (int i = 0; i < array.count; i++) {

        NSLog(@"%@",array[i]);

    }


 


 


6.简述你对UIView,UIWindow和CALayer的理解。


答:UIWindow是应用的窗口


      UIView是建立窗口中的一个视图,能够响应交互事件


      CALayer不能够响应事件


 


7.写一个完整的代理,包括声明,实现。


答:在具体问题模块会单独介绍


 


8.分析json、xml的区别?json、xml解析方式的底层是如何处理的?


答:json数据小,易解析,不复杂    xml数据较大,比较复杂


      json中以key/value形式保存,大多数是字典数组模式


      xml中则是<>


 


9.ViewController的didReceiveMemoryWarning是在何时被调用的?默认的操做是什么?


答:当应用程序的内存使用接近系统的最大内存使用时,应用会向系统发送内存警告,这时候系统会调用方法向全部的ViewController发送内存警告


 


10.面向对象的三大特征,并做简单的介绍。


答:封装、继承、多态


封装:将一个实例的全部属性封装到某个类中


继承:子类继承父类全部方法和属性


多态:父类指针指向子类对象


 


11.重写一个NSString类型的,retain方式声明name属性的setter和getter方法。


答:


- (void)setName:(NSString *)name{


   if(_name != name){


[_name retain];


[_name release];


_name = name;


}


}


- (NSString *)name{


return [[_name retain]autorelease];


}


 


12.简述NotificationCenter、KVC、KVO、Delegate?并说明它们之间的区别?


答:消息中心,消息通知;


      利用键-值间接访问类中的某个属性


      利用键-路径间接访问类中的某个属性,也称观察者模式


      代理,多用于两个类之间的传值


      区别:


 


13.what is lazy loading?


答:延时加载,按需加载。


 


14.什么是Protocol?什么是代理?写一个委托的interface?委托的property声明用什么属性?为何?


答:协议,用来在两个ViewController交互时所定的协议。


      代理,第三方中介。


      @protocol PersonDelegate NSObject


      - (void)setNum;


      @end


      @property (nonatomic,assign) iddelegate;


      防止循环引用


 


15.分别描述类目(categories)和延展(extensions)是什么?以及二者的区别?继承和类目的实现中有何区别?为何Category只能为对象添加方法,却不能添加成员变量?


答:extensions能够声明属性   不用实现方法;


      category能够为当前类生成私有方法,子类不能直接调用;


      可是经过继承,子类能够调用父类全部的属性和方法;


      回头补上


 


16.Objective-C 有私有方法吗?私有变量呢?若是没有的话,有没有什么代替的方法?


答:没有私有方法,有私有变量


      私有方法能够用 category 和 extension 来代替


 


17.#import、#include和@class有什么区别


答:有时间补


 


18.谈谈你对MVC的理解?为何要用MVC?在Cocoa中MVC是怎么实现的?你还熟悉其余的OC设计模式或别的设计模式吗?


答:M----model    V----view    C----controller


      MVC可让咱们的项目框架更加清晰,同时可让1个controller对应多个model,改代码的时候也方便;


      Cocoa中,回头补


      单例模式,Delegate模式,KVC模式,消息通知模式,Target/Action模式


 


19.如检测系统键盘的弹出


答:[[NSNotificationCenter defaultCenter]addObserver:self  selector:@selector()  name:UIKeyboardWillShowNotification  object:nil];


 


20.举出5个以上你所熟悉的ios sdk库有哪些和第三方库有哪些?


答:1.AFNetworking


      2.ASIHttpRequest


      3.shareKit


      4.FMDatebase


      5.MMDrawerController


      回头再研究一些单独列出来


 


21.如何将产品进行多语言发布?


答:国际化语言改为English


 


22.如何将敏感字变成**


答:



NSMutableArray *array = [[NSMutableArray alloc]init];//本地敏感字库

    NSString *a = @"敏感字";//本地敏感字库里存的某个敏感字

    NSString *b = @"我";

    

    [array addObject:a];

    [array addObject:b];

    

    //下面是方法

    NSMutableString *s = [[NSMutableString alloc]initWithString:@"我是敏感字"];//要判断的字符串

    for (int i = 0; i < array.count; i++) {

        NSString *minganzi = array[i];

        NSMutableString *replaceString = [[NSMutableString alloc]init];

        for (int j = 0; j < s.length - a.length + 1; j++) {

            NSRange range;

            range.length = minganzi.length;

            range.location = j;

            if ([[s substringWithRange:range] isEqualToString:minganzi]) {

                for (int k = 0; k < range.length; k++) {

                    [replaceString appendString:@"*"];

                }

                [s replaceCharactersInRange:range withString:replaceString];

            }

        }

    }

    NSLog(@"%@",s);


 


23.objc中的减号和加号表明什么?


答:实例对象方法    类方法


 


24.单例目的是什么,并写出一个?


答:节省内存


      回头用GCD写一个


 


25.说说响应链


答:nextResponse   View找它的Controller


 


1.咱们说的OC时动态运行时语言是什么意思?什么是动态识别,动态绑定?


答:动态类型  --  id     动态绑定  --  @selector()   动态下载


 


2.分别描述内存管理要点、autorelease、release、NSAutoreleasePool?并说明autorelease是何时被release的?简述何时由你负责释放对象,何时不禁你释放?[NSAutoreleasePool release] 和 [NSAutoreleasePool drain]有什么区别?


答:


 


3.说说下面关键词在内存管理的做用:alloc、init、copy、retain、release、autorelease、dealloc、retain count?


答:


 


4.drawRect和layouSubviews 的区别?


答:


 


5.http 和 scoker通讯的区别?socker链接相关库,TCP,UDP的区别?


答:


 


6.什么是键值、键路径是什么?


答:KVC   setValue:@"" forKey:@""


      KVO   setValue:@"" forKeyPath@""


 


7.声明一个静态方法和一个实例方法?


答:类方法与实例方法


+(id)personWithName:(NSString *)name{


Person *person = [[Person alloc]initWithName:name];


return [person autorelease]; 


}


- (id)initWithName:(NSString *)name{


self = [super init];


  if(self){


self.name = name;


}


return self;


}


 


8.什么是push?远程推送?


答:


 


9.init和initWithObject区别(语法)?


答:后者给属性值


 


10.请写出代码,用block来取代上例中的protocol,并比较两种方法的优点。实际应用部分?请写出代码,用blocks取代协议或回调方法。


答:int (^myBlock)(int) = ^(int a){return a;};


回头在具体分析模块中总结


 


11.你作iphone开发时候,有哪些传值方式,view和view之间是如何传值的?


答:属性,Delegate,单例,消息通知,Block


 


12.给定的一个字符串,判断字符串中是否含有png,有就删除它?


答:


 


13.对于语句NSString* testObject = [[NSData alloc]init];testObject在编译时和运行时分别是什么类型的对象?


答:编译时是NSString,运行时是NSData


 


14.OC中是全部对象间的交互是如何实现的?


答:消息机制


 


15.目标-动做机制


答:Target - action


 


16.for(int index = 0; index < largenumber; index++){


NSString *tempStr = @"tempStr";


NSLog(tempStr);


NSNumber *tempNumber = [NSNumber numberWithInt:2];


NSLog(tempNumber);


}


这段代码有什么问题?会不会形成内存泄露(多线程)?在内存紧张的设备上作大循环时自动释放池是写在循环内好仍是循环外号?为何?


答:


 


17.描述上拉加载、下拉刷新的实现机制?


答:


 


18.什么是沙盒?沙盒包含哪些文件,描述每一个文件的使用场景。如何获取这些文件的路径?如何获取应用程序包中文件的路径?


答:保护程序安全性


      Documents


      library


      tmp


 


19.介绍一下XMPP?有什么优缺点?


答:回头尝试


 


20.谈谈对性能优化的见解,如何作?


答:根据用户的需求作优化


 


21.应用程序如何省电?


答:先关闭全部跟网络有关的选项,代码里回头补


 


22.写一个递归方法:计算N的阶乘,而后将计算结果进行存储。以便应用退出后下次启动可直接获取该值。


答:


@property (nonatomic,assign) int sum;


在初始化方法中初始_sum = 1;


- (int)cheng:(int)n{


if(n != 1){


_sum = _sum * n;


n--;


[self cheng:n];


}else{


[[NSUserDefaults standerUserDefaults]setObject: [NSString stringWithFormat:@"%d",_sum] forKey:@"cheng"];


}


}


 


23.NSArray 和 NSMutableArray 的区别,多线程操做哪一个更安全?


答:不可变数组更安全


 


24.当前有一个数组,里面有若干重复的数据,如何去除重复的数据?(会几个写几个)


答:1,2,3,4,5,6,7,8,9,10 ………… 99,100


将数组中全部数字去出来,存到新数组下标为对应数字的位置


 


25.isKindOfClass、isMemberOfClass 做用分别是什么?


答:前者判断是否属于该类及该类祖宗类,后者只判断是否属于该类


 


26.写出下面程序段的输出结果


NSDictionary *dict = [NSDictionary dictionaryWithObject:@"a string value" forKey:@"akey"];


NSLog(@"%@",[dict objectForKey:@"akey"]);


[dict release];


答:崩溃


 


27.请写出如下代码的执行结果


NSString *name = [[NSString alloc]init];


name = @"Habb";


[name release];


答:申请内存没有用到


 


28.请分别写出SEL、id的意思?


答:动态绑定方法   动态类型


 


29.iPhone上,不能被应用程序直接调用的系统程序是什么?


答:


 


30.以.mm为拓展名的文件里,能够包含的代码有哪些?c和obj-c如何混用?


答:C、Object-C、C++


 


31.说说如何进行后台运行程序?


答:


 


32.sizeof 和 strlen 的区别和联系?


答:前者算内存    后者判断字符串长度


 


33.sprintf,strcpy,memcpy的功能?使用上要由哪些要注意的地方。


答:sprintf:将某类型转换成字符串类型


strcpy:拷贝某字符串,长度要相等,考虑'/0'


memcpy:拷贝内存


 


34.本身写函数,实现strlen功能。


答:



int sl(const char *s)

{

    int length = 0;

    while (*s!='') { 

        s++;

        length++;

    }

    return length;

}


 


35.写一个代码片断输入一个字符串“20130322152832”,输出一个NSDate类型的对象、打印该对象输出 2013-03-22 15:28:32


答:


NSDateFormatter *formatter = [[NSDateFormatter alloc]init];


[formatter setDateFormat:@"yyyy-MM-dd:HH-mm-ss"];


NSLog(@"%@",[formatter stringWithDate:[NSDate date]);


 


36.找错误


a: void test1()


{


char string[10];


char *str1 = "0123456789";


加个'/0'


strcpy(string,str1);


}


 


b:void GetMemory(char **p,int num)


{


*p = (char *)malloc(num);


}


 


void Test(void)


{


char *str = NULL;


GetMemory(&str,100);


strcpy(str,"hello");


printf(str);


}


 


37.用变量a写出如下定义


a、一个整型数


b、一个指向整型数的指针


c、一个指向指针的指针,它指向的指针是指向一个整型数


d、一个有10个整型数的数组


e、一个有10个指针的数组,该指针是指向一个整型数的


f、一个指向有10个整型数数组的指针


g、一个指向函数的指针,该函数有一个整型参数,并返回一个整型数


答:


 


 


今天先写到这里,明天继续!


 


 


上一篇: CSS 面试题总结
下一篇: Linux面试题总结