美文网首页
ios面试题之代码相关

ios面试题之代码相关

作者: 伶俐ll | 来源:发表于2018-07-16 12:09 被阅读20次

一、以下代码能不能执行成功?如果可以,打印结果是什么?

// Person.h
#import <Foundation/Foundation.h>
@interface Person : NSObject
@property (nonatomic, strong) NSString *name;
- (void)test;
@end

// Person.m
#import "Person.h"
@implementation Person
- (void)test
{
    NSLog(@"test print name is : %@", self.name);
}
@end
// ViewController.m
@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    
    id cls = [Person class];
    void *obj = &cls;
    [(__bridge id)obj test];
}

答:可以打印成功,打印结果test print name is : <ViewController: 0x7f95514077a0>
原理解析:
1、id cls = [Person class]; void *obj = &cls; [(__bridge id)obj test];结构解析

image.png

2、 [super viewDidLoad];内部objc_super2结构体内存储如下

struct objc_super = {
    self,
    [ViewController Class]
};

3、局部变量在栈空间内是由高地址向低地址连续存储的


屏幕快照 2018-07-16 下午12.07.15.png

二、下面代码的打印结果是什么?

 dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
 dispatch_async(queue, ^{
        NSLog(@"1");
        [self performSelector:@selector(test) withObject:nil afterDelay:.0];
        NSLog(@"3");
    });

- (void)test
{
    NSLog(@"2");
}

打印结果是 1、3
原因:

  • performSelector:withObject:afterDelay:的本质是往Runloop中添加定时器
  • 子线程默认没有启动Runloop
  • 如果想要正常调用test,代码如下
dispatch_queue_t queue = dispatch_get_global_queue(0, 0); 
dispatch_async(queue, ^{
        NSLog(@"1");
        [self performSelector:@selector(test) withObject:nil afterDelay:.0];
        NSLog(@"3");
        [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
    });

三、指出以下两种property的写法,分别可能造成什么隐患?

@property (nonatomic,strong)NSArray *arr;
@property (nonatomic,copy) NSMutableArray *mutableArr;
  • 1、当把arr赋值给可变数组,在可变数组改变的时候,arr会跟着变化。
  • 2、mutableArr用copy修饰,会生成不可变数组,当给数组添加元素的时候,会报如下错误-[__NSArray0 addObject:]: unrecognized selector sent to instance

相关文章

网友评论

      本文标题:ios面试题之代码相关

      本文链接:https://www.haomeiwen.com/subject/ycnvpftx.html