iOS开发之面试题-2018篇

1.instancetype与id的区别
<1.>
(1.)id在运行时确定对象类型
(2.)instance在编译时确定对象类型
<2.>
(1.)id可以当作参数与返回值还可以定义变量
(2.)instance只能当作返回值
<4.>
(1.)如果init方法的返回值是instancetype,那这个返回值赋值给其他对象会报警告
(2.)如果init方法的返回值是id, 那么将init返回的对象地址赋值给其它对象是不会报错的.
自定义构造方法时, 返回值尽量使用instancetype, 不要使用id

2.property是什么?
property = 实例变量 + get方法 + set方法

3.什么情况需要使用weak关键字?相比assign有什么不同
(1.)可能出现循环引用需要使用,比如delegate
(2.)自身已经被强引用,例如IBOutlet(父控件的subViews数组已经对它有一个强引用)
不同:
assign可以用于非oc对象(NSInteger等), weak只能用于oc对象
weak 表明该属性定义了一种“非拥有关系”。在属性所指的对象销毁时,属性值会自动清空(nil)

4.copy与mutablecopy有什么不同
copy对不可变对象的操作都是浅拷贝(只拷贝指针,不拷贝内容),copy与mutablecopy其他情况都是深拷贝,具体可以自己敲一遍,这样可以加深理解

*5.这个写法会出什么问题:@property (nonatomic, copy) NSMutableArray arr;
增删改时会崩溃,因为copy后返回的是不可变对象(NSAarray)
如:-[__NSArrayI removeObjectAtIndex:]: unrecognized selector sent to instance 0x7fcd1bc30460

6.OC的数据类型与C的基本数据类型有什么区别?NSInteger与int有什么区别呢?
OC的数据类型都是class,创建后即是对象(例如:NSString等)
C的基本数据类型只是一个拥有一定字节的内存空间,用于存放数值;
NSInteger与int都是基本数据类型,而NSInteger是int或long的别名,他会根据系统是32位还是64位来决定是int还是long

7.@synthesize 和 @dynamic 分别有什么作用?与property有什么区别?
@synthesize是系统自动生成get与set,@dynamic是阻止@synthesize自动生成,需要手动生成get与set需要使用@dynamic;property是在.h里实现set 和 get,@synthesize是在.m,如果@synthesize同时出现set与get需要 @synthesize x = _x,现在使用property即可

8.Objective-C 如何对内存管理的,说说你的看法和解决方法?
答:Objective-C的内存管理主要有三种方式ARC(自动内存计数)、手动内存计数、内存池。
1). 自动内存计数ARC:由Xcode自动在App编译阶段,在代码中添加内存管理代码。
2). 手动内存计数MRC:遵循内存谁申请、谁释放;谁添加,谁释放的原则。
3). 内存释放池Release Pool:把需要释放的内存统一放在一个池子中,当池子被抽干后(drain),池子中所有的内存空间也被自动释放掉。内存池的释放操作分为自动和手动。自动释放受runloop机制影响。

//此处可以拿UIButton的创建举例,UIButton有两种初始化方法 // 不需要release,根据autorelease pool进行释放 
 //(1.) UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; 
  // 该方法引用计数是加1的,arc下系统管理释放,mrc下手动release 
 //(2.) UIButton *button = [[UIButton alloc] init];   
//题外话(和内存没关系):buttonWithType可以指定button的类型,alloc无法指定buttonType,系统文档中也没有alloc初始化方法,所以还是推荐使用buttonWithType初始化

还是使用NSArray举例子吧,这样清晰一点

// 不需要release,根据autorelease pool机制进行释放
NSArray *arr = [NSArray array];
// 引用计数加1,需要release,只不过现在arc下系统帮助我们处理了释放
NSArray *arr = [[NSArray alloc] init];

8.Objective-C 中创建线程的方法是什么?如果在主线程中执行代码,方法是什么?如果想延时执行代码、方法又是什么

 1. NSThread
 创建一:
NSThread *oneThread = [[NSThread alloc] initWithTarget:self selector:@selector(sayMethod) object: nil];
创建二
[self performSelectorInBackground:@selector(sayMethod) withObject:nil];
还有其他方法,小伙伴可以自己去看下
 2. CGD
 // 异步返回主线程更新UI
 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        dispatch_async(dispatch_get_main_queue(), ^{
            [self.tableView reload];
        });
    });
 3. NSOperation
//一个NSOperation对象可以通过调用start方法来执行任务,默认是同步执行的。也可以将NSOperation添加到一个NSOperationQueue(操作队列)中去执行,而且是异步执行的
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
}];

9.Category(类别)、 Extension(扩展)和继承的区别
(1.)分类有名字,类扩展没有分类名字,是一种特殊的分类。
(2.)分类只能扩展方法(属性仅仅是声明,并没真正实现),类扩展可以扩展属性、成员变量和方法。
(3.)继承可以增加,修改或者删除方法,并且可以增加属性。3. 继承可以增加,修改或者删除方法,并且可以增加属性。

10.delegate与Notification的区别
delegate:一对一反向传递消息
Notification:一对多,只要监听,就可以收到

11.什么是KVO与KVC?
KVO:键值编码,通过字符串给属性赋值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值