成都ios培训
达内成都高升桥中心

15023458194

热门课程

IOS基础面试题<二>

  • 时间:2018-05-04 15:22
  • 发布:成都达内ios课程首页
  • 来源:成都达内

11. 重写getter/setter方法

假设声明属性:

@property (nonatomic, copy) NSString *blogName;

重写这个属性的getter/setter方法:

参考答案:

这里一旦连getter方法也重写,编译器不会给我们自动生成成员变量_blogName,因此我们需要在类的声明中添加一个成员变量_blogName:

@interface Demo () {

NSString *_blogName;

}

@end

在自动内存管理下(ARC):

- (void)setBlogName:(NSString *)aName {

if (_blogName != aName) {

_blogName = nil;

_blogName = [aName copy];

}

}

- (NSString *)blogName {

return _blogName;

}

对于手动内存管理(MRC):

- (void)setBlogName:(NSString *)aName {

if (_blogName != aName) {

[_blogName release];

_blogName = nil;

_blogName = [aName copy];

}

}

- (NSString *)blogName {

return _blogName;

}

12. obj在编译时和运行时分别时什么类型的对象

如下面的代码,obj在编译时和运行时分别时什么类型的对象:

NSString *obj = [[NSData alloc] init];

参考答案:

在编译时,我们所声明的obj是NSString *类型,因此是NSString类型对象。在运行时,由于指针obj所指向的是NSData类型对象的内存,因此实际上是NSData类型的对象。在编译时,这一行代码会转换成类似这样:

NSString *obj = ((id (*)(id, SEL))objc_msgSend)([NSData class], @selector(alloc));

obj = ((id (*)(id, SEL))objc_msgSend)((id)obj, @selector(init));

由于在编译时,转换成id,因此可以用NSString *指向NSData对象,而id是具备运行时特性的,因此在链接时,通过id的isa指针可以找到其所属的类,因此最终类型还是通过isa确定其所属类型。

13. id声明的对象有什么特性?

id类型可以指向任何类型的对象。

参考答案:

我们先看看其定义:

/// Represents an instance of a class.

struct objc_object {

Class isa OBJC_ISA_AVAILABILITY;

};

/// A pointer to an instance of a class.

typedef struct objc_object *id;

可其定义可知id类型是一个指向objc_object结构体类型的指针,这个结构体只有一个指向对象无类的指针isa,因此id可以指向任何类型的对象,故其具备运行时特性。

14. iOS设备性能测试

在实际开发中,我们经常需要对应用瘦身,因此对性能的检测是很重要的。

参考答案:

使用Profile-> Instruments ->Time Profiler可以检测性能。

15. Objective-C中有私有方法、私有变量么?

我记得曾经我就被这么问过,不知道大家有没有遇到过。

参考答案:

在类的.m实现文件内声明,就可以作为私有方法、私有变量。但是,并不是绝对的私有,如果外部知道有这么个方法,一样可以调用,而且不会报错。就像苹果公司没有公开出来的API,只要我们通过其它方式了解到api就可以调用。于是苹果审核时经常由于使用了私有api而打回来了。

16. 简述tableview的重用机制

曾经笔者面试时,也被问到这个问题。

参考答案:

[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]

这个方法就是重用机制的核心了。比如,有一个界面可显示10个cell,那么创建10次cell,并给cell指定同样的重用标识(当然,可以为不同显示类型的cell指定不同的标识)并且10个cell将全部都加入到visiableCells数组,reusableTableCells为空.

滚动tableView,当有一个cell完全移出屏幕时,这个cell就会被加入到reusableTableCells。而新出现的那个cell将加入到visiableCells,而这个cell就是被重用的。

如果要让tableview不重用,不设置reuseIdentifier就可以了。

17. nil与NULL的区别

参考答案:

nil和C语言的NULL相同,在objc/objc.h中定义。nil表示Objective-C对象的值为空。在C语言中,指针的空值用NULL表示。在Objective-C中,nil对象调用任何方法表示什么也不执行,也不会崩溃。

18. Category是什么,何时使用?

参考答案:

Category就是所谓的扩展。

有时我们需要在一个已经定义好的类中增加一些方法,而不想去重写该类,这时候使用扩展就很好。比如,当工程已经很大,代码量比较多,或者类中已经有很多方法,已经有其他代码调用了该类创建对象并使用该类的方法时,可以使用类别对该类扩充新的方法。

笔者所到公司之处,都会根据公司的UI风格定制一套UI组件,统一全局的风格。本人向来不喜欢用xib/storyboard开发,因为维护成本太高了。我们不能通过继承的方式定制各种组件吧?所以这个时候使用扩展是最佳时期.

19. 什么是Delegate?常用场景?

参考答案:

Delegate就是所谓的代理,代理是一种设计模式。在iOS开发中,会使用到大量的代理,而代理设计模式是苹果中的标准设置模式。

常用场景有反向传值。比如:苹果的蓝牙,我们进入到下一个界面去打开或者关闭蓝牙,当操作之后需要将状态反馈到前一个界面,并更新显示。对于这种状态,使用代理设计模式是很标准的模式。

20. 什么是单例,如何设计单例?

参考答案:

单例就是全局都只有一个对象存在,而且是在整个App运行过程中都存在。每个App都会有单例,比如UIApplication。而我们在做用户数据存储时,通常都会用单例存储,因为应用在所有操作中,经常要求先登录。

下面这种写法是最常用的写法,这个是线程安全的。

+ (instancetype)shared {

static HYBUserManager *sg_userManager = nil;

static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

if (sg_userManager == nil) {

sg_userManager = [[HYBUserManager alloc] init];

}

});

return sg_userManager;

}

关注成都达内微信公众号,获取达内19大课程1元试学两周名额

上一篇:IOS基础笔试题<一>
下一篇:IOS基础面试题<三>
选择城市和中心
贵州省

广西省

海南省