iOS 3月面试笔记

前言

最近在面试,记录一些有意思的面试题,也会把自己理解的答案记下来
原文链接

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数据转化为我们要显示的页面,请使用效率最高的办法,伪代码即可.

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,RGBY表示四种颜色,前方的字母表示银行缩写

页面效果

答案:把excel读取成字典的形式.但这里有很多可以优化的地方,例如可以建一个管理类的单例,这样我们可以利用缓存,缓存查找不到从磁盘获取,磁盘查找不到从原文件获取,然后银行卡页面销毁后我们再销毁单例就可以了.可以考察的地方很多.

  • 多线程与线程安全
阅读更多

没有更多推荐了,返回首页