iOS面试题

1.nonatomic,readwrite,assign,strong,copy,weak,readonly,retain,release关键字的意思?

nontomic原子性,被修饰的属性编译器不使用同步锁
readwrite:属性拥有setter和getter方法,编译器会自动生成这两个方法
readonly:属性仅拥有getter方法,编译器会自动生成getter方法。
assign:用于修饰"纯量类型"
strong :强引用,表明该属性定义了一种"拥有关系"。
weak:弱引用。
copy:深拷贝,给属性赋值时,设置方法不保存新值,而是将其拷贝一份
retain:计数器+1
release:计数器-1

2.iOS支付的整个流程?

微信支付流程
3.在过往的工作中你遇到了哪些难点,又是如何解决它的?

4.在开发中有使用runtime去做一些事情吗?具体有哪些?

  • 使用Method Swizzling(黑魔法)替换系统的方法:有个需求需要统计一个控制器出现的次数,使用runtime的替换方法改变viewWillAppear系统方法的实现。
  • 使用runtime对属性进行获取与赋值,利用runtime可以自己写一个Json解析的三方库
  • JSPatch利用的也是runtime机制,使js就可以调用OC的原生库。
5.平均每年一家公司,说说为什么离职?

  • 第一家实习的公司,因为工资问题
  • 第二家是外包公司,不想干
  • 第三家是因为公司解散。
6.NSTimer和在UITableView滑动列表时,timer会暂定回调,为什么?如何解决?

原因:
RunLoop只能运行在一种mode下,如果要换mode,当前的loop也需要停下重启成新的。利用这个机制,ScrollView滚动过程中NSDefaultRunLoopMode(kCFRunLoopDefaultMode)的mode会切换到UITrackingRunLoopMode来保证ScrollView的流畅滑动:只能在NSDefaultRunLoopMode模式下处理的事件会影响ScrollView的滑动。

解决:
可以通过将timer添加到NSRunLoopCommonModes(kCFRunLoopCommonModes)来解决。

7.本地存储对象的方式有哪些?

  • 归档解档
  • CoreData
  • Sqlite
  • FMDB
    注意:NSUserDefault和Plist都不能存储对象。
8.FMDB用过,你知道最主要的类有那些吗?

FMDatabase FMDataBaseQueue

9.OC与C语言的区别?

C语言是编译语言 OC是面向对象的动态语言
OC除了编译器外,还有自身特有的Runtime机制,用来动态的创建对象及消息的发送与转发。

10.要先下载多张图片,多张图片下载完成之后将图片合成一张,你如何实现?

使用GCD里面的队列组,将多个任务放到异步队列组中执行,然后在dispatch_group_notify方法里面执行最后的操作。

 // 1.队列组  
    dispatch_group_t group = dispatch_group_create();  
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);  
      
    // 2.下载图片1  
    __block UIImage *image1 = nil;  //要加一个 __block因为 block代码默认不能改外面的东西(记住语法即可)  
    dispatch_group_async(group, queue, ^{  
        NSURL *url1 = [NSURL URLWithString:@"http://g.hiphotos.baidu.com/image/pic/item/f2deb48f8c5494ee460de6182ff5e0fe99257e80.jpg"];  
        NSData *data1 = [NSData dataWithContentsOfURL:url1];  
        image1 = [UIImage imageWithData:data1];  
    });  
      
    // 3.下载图片2  
    __block UIImage *image2 = nil;  
    dispatch_group_async(group, queue, ^{  
        NSURL *url2 = [NSURL URLWithString:@"http://su.bdimg.com/static/superplus/img/logo_white_ee663702.png"];  
        NSData *data2 = [NSData dataWithContentsOfURL:url2];  
        image2 = [UIImage imageWithData:data2];  
    });  
      
    // 4.合并图片 用Quartz2D的知识,则要先要搞一个空的大图片,然后再把小图片画上去(保证执行完组里面的所有任务之后,再执行notify函数里面的block)  
    //队列组:要把队列组里面的所有任务都执行完后调用dispatch_group_notify(group, queue, ^{ }  
    dispatch_group_notify(group, queue, ^{  
        // 开启一个位图上下文  
        UIGraphicsBeginImageContextWithOptions(image1.size, NO, 0.0);  
          
        // 绘制第1张图片  
        CGFloat image1W = image1.size.width;  
        CGFloat image1H = image1.size.height;  
        [image1 drawInRect:CGRectMake(0, 0, image1W, image1H)];  
          
        // 绘制第2张图片  
        CGFloat image2W = image2.size.width * 0.5;  
        CGFloat image2H = image2.size.height * 0.5;  
        CGFloat image2Y = image1H - image2H;  
        [image2 drawInRect:CGRectMake(0, image2Y, image2W, image2H)];  
          
        // 得到上下文中的图片  
        UIImage *fullImage = UIGraphicsGetImageFromCurrentImageContext();  
          
        // 结束上下文  
        UIGraphicsEndImageContext();  
          
        // 5.回到主线程显示图片  
        dispatch_async(dispatch_get_main_queue(), ^{  
            self.imageView.image = fullImage;  
        });  
    }); 
11.你平时会怎么来学习?

  • 官方文档
  • 大牛的博客
  • github
  • 视频教程
12.block与delegate的区别?

block侧重消息的传递的结果
delegate可以监测消息传递的过程

13.做过蓝牙吗?实现的过程是?

蓝牙.png
14.遇到bad_Access是什么原因,你会如何去处理?

bad_Access内存错误调试
遇到BAD_ACCESS怎么办?
访问了野指针的时候,比如一个已经释放的对象执行了release、访问已经释放对象的成员变量或者发消息

15.讲一下购物车实现的过程?

购物车.png
16.nil对象去调用方法会出现问题吗?

不会出现程序崩溃,但不会发送消息,直接返回nil或0
OC中向nil发消息,程序是不会崩溃的。
因为OC的函数都是通过objc_msgSend进行消息发送来实现的,相对于C和C++来说,对于空指针的操作会引起crash问题,而objc_msgSend会通过判断self来决定是否发送消息,如果self为nil,那么selector也会为空,直接返回,不会出现问题。视方法返回值,向nil发消息可能会返回nil(返回值为对象),0(返回值为一些基础数据)或0X0(返回值为id)等。但对于[NSNull null]对象发送消息时,是会crash的,因为NSNull类只有一个null方法。

NSString *str = nil;
[str stringByAppendingString:@"ssssss"];

调用方法的时候,还是会执行objc_msgSend()消息转发的函数,但是当传过来的object为nil的时候,objc_msgSend()会直接返回nil或0,不会执行消息转发。

17.排序算法你知道哪些?链表,栈,队列的区别?树,图这些你知道吗?
18.你有一些未来规划?

未来规划:

  • 首先是过好每一天。
  • 坚持跑步,强健体魄,摆脱体质差对人生的困扰。
  • 坚持每天计划地制定和执行。(重在执行)
  • 然后朝着让自己变得更好的方向发展。
19.远程推送原理
远程推送.png

APNS工作流程.png

文字概括.png
20.NSString *str = nil;与NSString *str = @"";的区别?
  • nil就是把一个对象的指针置为空,只是切断了指针与内存中对象的联系;如果在设置为nil之前没有调用release,那么该段内存是没有释放,这就很容易造成内存泄漏。
  • @""就是开辟了一段内存,但是没有存放任何字符串内容(或者说是存放了空字符串)

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