iOS面试题 2016版

2015-1-3 达内纪老师 GitHubCSDN博客

说明:
最近为达内学员整理面试题。发现网上的面试题和答案基本都是抄来抄去的,甚至很多答案都是错误的。
所以整理了常见的面试题,对答案重新进行了筛选整理。
如果答案有错漏或者更好的答案,希望大家能够在GitHub或者CSDN通知我。
此文档将会持续更新。GitHub会优先更新。
1. OC中,与alloc语义相反的方法是dealloc还是release?与retain语义相反的方法是dealloc还是release?为什么?需要与alloc配对使用的方法是dealloc还是release,为什么?
    以下是针对MRC(手动内存释放)模式:
    与alloc语义相反的方法是dealloc,与retain语义相反的方法是release。
    alloc是为对象在内存中开辟空间,而dealloc则是对象销毁时释放空间。
    retain方法是对象开辟空间以后使对象的引用计数器加1,而release是对象的引用计数器减1。
    需要与alloc配对的方法是release,因为对象创建以后,对象的引用计数器自动加1,
    而调用release方法后,对象的引用计数器归0,系统会自动调用dealloc方法释放空间。

MRC1

2. 在一个对象的方法里面:self.name = @"object";_name = @"object"有什么不同吗?
    self.name = @"object"; 是通过点语法修改属性name的值。
    本质上使用的是name属性的setter方法进行的赋值操作,实际上执行的代码是

    [self setName:@"object"];

    例如:
    @property(nonatomic, strong) NSString *name;
    //根据@property关键词,系统自动生成setter方法。
    - (void)setName:(NSString *)name{
        //根据strong关键词
        [name retain];  //内存计数+1
        [_name release];    //把之前指针指向的内容内存计数-1
        _name = name; //指向新内容
    }

    _name = @“object”; 只是单纯的把‘_name’指针指向‘@"object"’字符串对象所在的地址,
    没有调用方法。

点语法2

3. 这段代码有什么问题吗?

-(void)setAge:(int)newAge{
self.age = newAge;
}

    在age属性的setter方法中,不能通过点语法给该属性赋值。
    会造成setter方法的循环调用。因为self.age = newAge; 
    本质上是在调用 [self setAge:newAge]; 方法。
    解决循环调用的方法是方法体修改为 _age = newAge;

    另外 变量名称不能使用new开头!
4. 以下每行代码执行后,person对象的retain count分别是多少?

Person *person = [[Person alloc] init];
[person retain];
[person release];
[person release];

   Person *person = [[Person alloc] init];  =1
   [person retain];  +1    = 2
   [person release];  -1   = 1
   [person release];  -1   = 0

   内存计数技术规律
   alloc,new,copy   内存计数 = 1
   retain +1
   release -1
   UIView  addSubview  +1
   NSMutableArray  addObject   +1
5. 这段代码有什么问题,如何修改?

for(int i = 0; i < someLargeNumber; i++){
NSString *string = @“Abc”;
string = [string lowercaseString];
string = [string stringByAppendingString:@“xyz”];
NSLog(@“%@“, string);
}

代码本身不会报错。
但是猜测出题者的意思是要循环添加为 abcxyzxyzxyz.....这样的形式。
如果是想在Abc后面拼接多个xyz字符串的话,
则需要把"NSString *string = @“Abc”;" 这行代码放在循环语句外面。
6. 简要叙述面向对象的特点,特别是多态。
1. 封装
封装是对象和类概念的主要特性。它是隐藏内部实现,提供外部接口,可以看作是“包装”。 
封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,
对不可信的进行信息隐藏。
封装的目的是增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口,
以特定的访问权限来使用类的成员。
好处:可以隐藏内部实现细节。通过大量功能类封装,加快后期开发速度。

2. 继承
面向对象编程 (OOP) 语言的一个主要功能就是“继承”。
继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下
对这些功能进行扩展。
通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”、“父类”或“超类”。
继承的过程,就是从一般到特殊的过程。在考虑使用继承时,有一点需要注意,
那就是两个类之间的关系应该是“属于”关系。
例如,Employee(雇员)是一个人,Manager(领导)也是一个人,因此这两个类都可以继承Person类。
但是 Leg(腿) 类却不能继承 Person 类,因为腿并不是一个人。

3. 多态
多态性(polymorphism)是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,
赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。
简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。
不同对象以自己的方式响应相同的消息的能力叫做多态。
意思就是假设生物类(life)都用有一个相同的 方法-eat;那人类属于生物,猪也属于生物,
都继承了life后,实现各自的eat,但是调用是我们只需调用各自的eat方法。
也就是不同的对象以 自己的方式响应了相同的消息(响应了eat这个选择器)。
实现多态,有二种方式,覆盖,重载。
•    覆盖(override),是指子类重新定义父类的虚函数的做法。
•    重载(over
  • 7
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值