IOS面试总结

前言

今天面了ios开发,面试官问的很细,有些东西平时都没注意到,所以想分享给大家,也是方便以后自己看,最后祝各位都能找到满意的工作,有错误的地方也欢迎大家指出。

1.下面的程序输出什么,为什么?

- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"1");
    dispatch_sync(dispatch_get_main_queue(), ^{
        NSLog(@"2");
    });
    NSLog(@"3");
}

2016-06-03 13:00:16.878 test[10966:8733088] 1

在主线程中执行同步方法,并且任务放在主线程队列中,主线程队列是串行队列,任务是一个一个执行的,所以这个同步方法只能等待主任务执行完成之后才能执行该同步方法中的任务,而主线程队列的主任务又要等待改同步方法执行完成之后才能继续执行,于是就造成了循环等待,导致程序卡住不动。

总结:主线程队列也就是主队列是一个特殊的串行队列,表现在该队列的任务无论是同步方法还是异步方法中执行都不会另外开队列,主队列的任务只会在主线程中执行。


2.用copy标识的NSString属性是深拷贝还是浅拷贝?

    LXPerson *person = [[LXPerson alloc]init];
    NSString *name = [NSString stringWithFormat:@"add"];
    person.name = name;
    NSLog(@"%@--%p", name, name);
    NSLog(@"%@--%p", person.name, person.name);

2016-06-04 11:04:51.428 test[1331:240405] add–0xa000000006464613
2016-06-04 11:04:51.428 test[1331:240405] add–0xa000000006464613

浅拷贝,这里为什么用copy却是浅拷贝呢,因为NSString本身就是不可变的,对于它来说浅拷贝还是深拷贝都是一样的,于是苹果采用浅拷贝,这样可以节省内存的开销,但是如果copy的对象如果是可变的,那就是深拷贝,比如NSMutableString。

总结:copy不可变的对象只复制内存,属于浅拷贝,而copy可变的对象就是拷贝整个对象的内容,属于深拷贝。


3.用copy标识的NSMutableArray属性是可变的还是不可变的?

copy的属性都是不可变的,如果想copy之后是可变的,使用mutableCopy属性。


4.如果对象为空,对它发送一个方法消息,会报错吗?

不会报错。


后续会继续补充的。。。

你可能感兴趣的:(IOS开发)