前言
最近在面试,记录一些有意思的面试题,也会把自己理解的答案记下来
原文链接
C语法
1描述下下列代码在C语言中会打印出来什么?为什么?
struct Test{ int a; int array[]; }; int main(int argc, const char * argv[]) { struct Test test_array[] = {{1}, {2}, {3}}; int sum = test_array[0].array[0] + test_array[1].a + test_array[2].a; printf("%d\n",sum); return 0; }
答案:7;在C中,在至少含有一个命名成员对象的结构体中,最后一个成员可以是不完全数组类型,大部分情况下,结构体的大小不会吧这个数组计算在内,而这个数组的偏移量一般是结构体大小,即此处的test_array[0].array[0]实际是test_array[1].a;
2 + 2 + 3 = 7.
基础部分
1描述一下下列代码会打印出来什么?
- (instancetype)init{ if (self = [super init]) { NSLog(@"1"); self.view.backgroundColor = [UIColor greenColor]; } return self; } - (void)viewDidLoad { [super viewDidLoad]; NSLog(@"2"); } - (void)loadView{ [super loadView]; NSLog(@"3"); }
答案:132,没什么好讲的,控制器的生命周期
2描述下下列代码会打印出来什么?
- (void)test{ dispatch_group_t taskGroup = dispatch_group_create(); dispatch_group_enter(taskGroup); dispatch_async(dispatch_get_global_queue(0, 0), ^{ NSLog(@"1"); dispatch_group_leave(taskGroup); }); dispatch_sync(dispatch_get_main_queue(), ^{ NSLog(@"4"); }); dispatch_group_notify(taskGroup, dispatch_get_global_queue(0, 0), ^{ self.view.backgroundColor = [UIColor greenColor]; NSLog(@"2"); }); NSLog(@"3"); }
答案:编译不通过,里面出现了死锁和在非主线程进行UI操作.
3以下代码在mrc环境运行,请回答会打印出什么,不用考虑下列代码需要release等操作
- (void)test{ Person *obj = [Person new]; obj.name = @"张三"; NSLog(@"%ld",[obj retainCount]); //这里修饰属性的是strong self.obj = obj; NSLog(@"%ld",[obj retainCount]); [obj copy]; NSLog(@"%ld",[obj retainCount]); }
答案:122,想考察引用计数
4 下面代码执行会有什么问题?
NSObject *obj = [NSObject new]; [[NSUserDefaults standardUserDefaults] setObject:obj forKey:@"haha"]; [[NSUserDefaults standardUserDefaults] synchronize];
答案:不能直接存储对象,会导致崩溃.
5 以下代码在iOS arc环境下有什么问题?向数组中添加和删除元素有什么问题? atomic能保证对象是线程安全的吗?为什么?
@property (copy, atomic) NSMutableArray <TradeRecordArrayModel *>*dataArray;
答案:copy会将可变数组变为不可变数组,向数组中增加或删除元素会崩溃.atomic仅仅修饰的是指针的线程安全,这里如果想保证对象的线程安全必须加锁,这里可以引出进一步考察锁.
进阶
- 1.iOS提供了哪些数据存储方式?它们都适用于哪些应用场景?
- 2.通过runtime添加的“关联对象”和类的实例变量有什么区别?使用时要注意什么,你使用runtime做过什么?
- 3.NSOperation和GCD的区别是什么?前者多用于什么场景?
- 4.使用ARC是否等同于没有内存泄漏?如果不是的话请举例
- 5.如果你是苹果的开发者,KVO,通知,weak这些如何去实现呢?大概说下思路就可以.
- 6.有完整创建过苹果证书并发布吗?
算法
- 1.如何把下面的这个json数据转化为我们要显示的页面,请使用效率最高的办法,伪代码即可.
答案:链接
- 2.不使用苹果官方的sort,或者NSSet,请将下列数组随机排序,友情提示:(arc4random()函数可以生成随机数)
答案:
- (NSArray *)p_getRandomArray:(NSArray *)originArray{
NSMutableArray *dataArray = [NSMutableArray arrayWithArray:originArray];
NSMutableArray *randomArray = [NSMutableArray array];
//随机次数
NSInteger enumCount = dataArray.count;
//随机池
NSInteger randomPoolCount = enumCount;
for (int i = 0; i < enumCount; i ++) {
NSInteger randomIndex = (NSInteger)arc4random() % randomPoolCount;
FYNumberPadModel *randomModel = dataArray[randomIndex];
[dataArray removeObject:randomModel];
[randomArray addObject:randomModel];
randomPoolCount --;
}
return [randomArray copy];
}
- 3现在有这样一个需求,银联大约有200家银行,每家银行卡美工要求对应不同的背景(一共是四种),excel文件如下,假设用户会绑很多卡,请问如何做效率最高.(提示:1,excel文件 2,用户有很多卡(很多cell))
下图是美工提供的excel,RGBY表示四种颜色,前方的字母表示银行缩写
答案:把excel读取成字典的形式.但这里有很多可以优化的地方,例如可以建一个管理类的单例,这样我们可以利用缓存,缓存查找不到从磁盘获取,磁盘查找不到从原文件获取,然后银行卡页面销毁后我们再销毁单例就可以了.可以考察的地方很多.
- 多线程与线程安全