iOS 面试题(一)

1.简述OC中内存管理机制。与retain配对使用的方法是dealloc还是release,为什么?需要与alloc配对使用的方法是dealloc还是release,为什么?readwrite,readonly,assign,retain,copy,nonatomic,atomic,strong,weak属性的作用?

答:OC中内存管理机制应该就是引用计数的增减吧,retainCount为0时释放该内存。
      retain对应的是release,内存的释放用release。
      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);
}

你可能感兴趣的:(iOS 面试题(一))