iOS常见的面试题详解

程序题一:

    @autoreleasepool {
        for (int i = 0; i < INT_MAX; i++) {
            SFPerson *person = [[SFPerson alloc] init];
            [person autorelease];
        }
    }

解释:autorelease虽然是使引用计数减1,但不是立即减1。它本质上只是把对象放到离它最近的自动释放池里,当自动释放池销毁了,才会想自动释放池里的每一个对象发送release消息。这道题问题就出在autorelease上,因为INT_MAX是一个很大的整形数,而autorelease又不能使引用计数减1,所以在循环结束前会造成内存溢出的问题。


解决方案:这样做就能保证在每创建一个对象,就会得到及时释放。


    @autoreleasepool  {
        
        for (int i = 0; i < INT_MAX; i++) {
            
            @autoreleasepool  {
                SFPerson *person = [[SFPerson alloc] init];
                [person autorelease];
            }
        }
    }


程序题二:

    @autoreleasepool  {
        
        NSString *string = [[NSString alloc] init]; // 1
        
        [string retain]; // 2
        [string retain]; // 3
        
        string = @"aaa";
        
        [string release];
        [string release];
        [string release];
    }

指针变量string原本指向一块开辟的堆区空间,但经过重新给赋值后,string的指向发生了变化,指向常量区。常量区的变量是自动管理内存的,不需要我们手动释放,这样一来,就导致原来的堆区内存没用被释放,造成内存泄露。

程序题三:

#import "SFPerson.h"

@interface SFStudent : SFPerson

@end


#import "SFStudent.h"

@implementation SFStudent

- (instancetype)init {
    self = [super init];
    if (self) {
        NSLog(@"%@", NSStringFromClass([self class]));
        NSLog(@"%@", NSStringFromClass([super class]));
    }
    return self;
}
@end

结果:都输出SFStudent

解释:self是类的隐藏参数,指向当前调用方法的这个类的实例,而super只是一个编译器标志符,和self是指向同一个消息接收者的。上述例子中,不管调用那个,接收消息的对象都是SFStudent *xx这个对象。而不同的是,super是告诉编译器,调用class这个方法时要去父类的方法开始查找,而不是从本类开始查找。self则会从当前类的方法列表中开始查找,如果没用,就去父类中再查找;而当使用super时,则从父类的方法开始查找,然后调用父类的这个方法。

其中 - (Class)class方法实现为:

- (Class)class {
	return object_getClass(self);
}

  • 调用[self class]时,先调用objc_msgSend函数,第一个参数是SFStudent当前这个实例,然后在SFStudent这个类中查找-(Class)class这个方法,没有,去父类SFPerson里面去找,也没有,最后在NSObject类中发现这个方法。而这个方法的实现就是返回self的类别,因此输出SFStudent;
  • 调用[super class]时,会转化成objc_msgSendSuper。第一步先构造objc_super结构体,结构体的第一个成员是self,第二个成员是(id)class_getSuperclass(objc_getClass(@"SFPerson"));实际结果会输出SFPerson。第二步是去SFPerson这个类中去找-(Class)class这个方法,结果没用,然后去NSObject,找到了。最后内部是使用objc_msgSend(objc_super->receiver,@selector(class))去调用,此时已经和[self class]调用相同了, 因此最后的输出结果是相同的,都是SFStudent。

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看READme.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 、 1资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看READmE.文件(md如有),本项目仅用作交流学习参考,请切勿用于商业用途。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值