1. Object-c的类可以多重继承么?可以实现多个接口么?Category是什么?重写一个类的方式用继承好还是分类好?为什么?
不可以多重继承;可以实现多个接口;Category是类别;重写一个类用类别比较好,因为用类别重写只对Category有效,不影响其他的类。
2. #import 跟#include 又什么区别,@class呢, #import<> 跟 #import””又什么区别?
#import是Object-C导入头文件的声明;#include是C语言导入头文件的声明;#import默认只导入头文件一次,相当于#include和#pragma once;@class是对类的声明;#import<>是导入系统头文件的声明。#import“”是到时用户头文件的声明
3. 属性readwrite,readonly,assign,retain,copy,nonatomic 各是什么作用,在那种情况下用?
readwrite: 可读可写性,生成getter和setter方法
readonly:只读性,只生成getter不生成setter方法,不希望属性在类外发生改变
assign: 赋值特性,setter方法将参数传入实例变量,仅设置变量时
retain : 持有特性,setter方法将参数先保留,再赋值,retaincount+1;
copy: 赋值特性,setter方法将传入对象复制一次,需要用到完全新的对象时使用
nonatomic:非原子特性:表示表示编译器生成的setter和getter方法是否是原子特性,atomic表示多线程安全,一般使用nonatomic;
4.对于语句NSString*obj = [[NSData alloc] init]; obj在编译时和运行时分别时什么类型的对象?
编译时是NSString类型,运行时是NSData.
5.常见的object-c的数据类型有那些, 和C的基本数据类型有什么区别?如:NSInteger和int
Object-C中数据类型有NSString,NSSArray,NSSMutableArray,NSSData等,这些都是类,初始化创建之后生成的是对象,而C语言中的int是数据类型,只是系统开辟的一些字节内存空间,而NSInteger也是数据类型,并不是NSNumber的子类,那当然更不会是NSObect的子类,它相当于C语言当中的int或者Long,区别在于系统内存是32位还是64位对应是int和Long
6.id 声明的对象有什么特性?
id是Object-C中的万能指针,它可以指向任何对象
7.Objective-C如何对内存管理的,说说你的看法和解决方法?
自动内存管理-ARC
手动内存管理-MRC
内存池
8. 原子(atomic)跟非原子(non-atomic)属性有什么区别?
atomic是原子性,提供多线程安全,防止在未完成的时候被其它线程索读取
nonatomic是非原子性,在自己管理的内存中,访问器自动保留并释放返回的值,若声明nonatomic,则只返回这个值。
9. 浅复制和深复制的区别?
答:浅层复制:只复制指向对象的指针,而不复制引用对象本身。
深层复制:复制引用对象本身。
意思就是说我有个A对象,复制一份后得到A_copy对象后,对于浅复制来说,A和A_copy指向的是同一个内存资源,复制的只不过是是一个指针,对象本身资源
还是只有一份,那如果我们对A_copy执行了修改操作,那么发现A引用的对象同样被修改,这其实违背了我们复制拷贝的一个思想。深复制就好理解了,内存中存在了
两份独立对象本身。
用网上一哥们通俗的话将就是:
浅复制好比你和你的影子,你完蛋,你的影子也完蛋
深复制好比你和你的克隆人,你完蛋,你的克隆人还活着。
10. 类别的作用?继承和类别在实现中有何区别?
答:category 可以在不获悉,不改变原来代码的情况下往里面添加新的方法,只能添加,不能删除修改,并且如果类别和原来类中的方法产生名称冲突,则类别将覆盖原来的方法,因为类别具有更高的优先级。
类别主要有3个作用:
1).将类的实现分散到多个不同文件或多个不同框架中。
2).创建对私有方法的前向引用。
3).向对象添加非正式协议。
继承可以增加,修改或者删除方法,并且可以增加属性。