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.做过蓝牙吗?实现的过程是?
14.遇到bad_Access是什么原因,你会如何去处理?
bad_Access内存错误调试
遇到BAD_ACCESS怎么办?
访问了野指针的时候,比如一个已经释放的对象执行了release、访问已经释放对象的成员变量或者发消息
15.讲一下购物车实现的过程?
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.远程推送原理
20.NSString *str = nil;与NSString *str = @"";的区别?
- nil就是把一个对象的指针置为空,只是切断了指针与内存中对象的联系;如果在设置为nil之前没有调用release,那么该段内存是没有释放,这就很容易造成内存泄漏。
- @""就是开辟了一段内存,但是没有存放任何字符串内容(或者说是存放了空字符串)