面试题

作者: 阳光下的叶子呵 | 来源:发表于2020-12-03 20:22 被阅读0次

    1、如何通过UIView获取当前的UIViewController
    2、说一说 iOS内存管理机制
    3、运行以下代码,输出什么?为什么会出现这样的结果?


    截屏2020-12-03 20.44.28.png
    @interface NSObject (Test)
    + (void)run;
    @end
    
    @implementation NSObject (Test)
    
    - (void)run {
        NSLog(@"加油");
    }
    @end
    

    运行 [NSObject run];
    输出:加油


    截屏2020-12-03 20.46.08.png

    4、运行以下代码,输出什么?为什么会出现这样的结果?

    在声明Block之后、调用Block之前对局部变量进行修改,在调用Block时局部变量值是修改之前的旧值

    void test(){
        int a = 10;
        void (^block)(void) = ^{
            NSLog(@"a is %d", a);
        };
        a = 20;
        block();
    }
    运行test();
    // 调用后控制台输出"a的值为:10"
    

    Block内访问__block修饰的局部变量
    在局部变量前使用__block修饰,在声明Block之后、调用Block之前对局部变量进行修改,在调用Block时局部变量值是修改之后的新值

       __block int a = 10;
        void(^myBlock)(void) = ^{
            NSLog(@"a的值==%d",a);
        };
        a = 11;
        // 调用后控制台输出"a的值== 11"
        myBlock();
    

    5、运行以下代码,输出什么?为什么会出现这样的结果?

    // 当前是主线程
        dispatch_queue_t queue = dispatch_queue_create("testQueue", DISPATCH_QUEUE_SERIAL);// 串行队列
        // 异步
        dispatch_async(queue, ^{
            NSLog(@"test1");
            
            // 同步
            dispatch_sync(queue, ^{
                NSLog(@"test2");
            });
        });
    
    截屏2020-12-03 21.04.02.png

    【程序崩溃!!!】
    输出结果:Thread 3: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
    【这表明您正在后台线程上做一些工作,并以某种方式修改UI而不分配给主线程】

    6、给定一个排序数组,删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。(注意要求:不使用额外的数组空间,并且在时间复杂度为O(1) 下完成)
    比方说:int test[] = {1,2,2,3,3,4,4,4,5,6,6};

    (思路):
    采用双指针法,初始时 i=0,j=1,然后移动 j ,判断nums[i] == nums[j] ,如果 nums[i] 不等于 nums[j] 则把 nums[j] 的值赋给 i 的的下一位,然后 i 自增1(此处注意 i++ 和 ++i 的区别)。

    class Solution {
    public:
        int removeDuplicates(vector<int>& nums) {
            int i=0;
            int n = nums.size();
            if(n==0) return 0;
            for(int j=1;j<n;j++){
                if(nums[i] != nums[j]) nums[++i] = nums[j];
            }
            return i+1;
        }
    };
    

    力扣提交结果:

    执行用时 : 32 ms, 在Remove Duplicates from Sorted Array的C++提交中击败了96.08% 的用户

    内存消耗 : 9.8 MB, 在Remove Duplicates from Sorted Array的C++提交中击败了87.58% 的用户

    (第二种方法):

    public int removeDuplicates(int[] nums) {
            //创建一个空集合
            List<Integer> list = new ArrayList<Integer>();
            for (int i = 0; i < nums.length; i++) {
                //如果集合不包含数组的某个元素,就把该元素添加到集合中。集合中包含的元素则不添加
                if(!list.contains(nums[i])){
                    list.add(nums[i]);
                }
            }
            int num =list.size();
            return num;
        }
    

    相关文章

      网友评论

          本文标题:面试题

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