1.import和 include的区别
#include:它用于对系统自带的头文件的引用,编译器会在系统文件目录下去查找该文件
#import:大部分功能和#include是一样的,但是他处理了重复引用的问题,我们在引用文件的时候不用去自己进行重复引用处理
2.@property作用:
a.生成一个带_的私有属性
b.生成这个私有属性的getter,setter方法的声明
c.生成这个私有属性的getter,setter方法的实现
3.栈和堆区别
a.栈:存储的是局部变量。当作用域结束的时候,由系统回收局部变量所占用的内存空间
b.堆:存储的是程序员手动申请的变量或者OC对象。如果要回收堆空间的变量,应该要使用free函数来进行释放
4.单例,如何使用单例
a.为单例对象实现一个静态实例,并初始化,然后设置成nil,
b.实现一个实例构造方法检查上面声明的静态实例是否为nil,如果是则新建并返回一个本类的实例
c.重写allocWithZone方法,用来保证其他人直接使用alloc和init试图获得一个新实力的时候不产生一个新实例,
d.适当实现allocWithZone,copyWithZone,release和autorelease
4.单例,如何使用单例
a.为单例对象实现一个静态实例,并初始化,然后设置成nil,
b.实现一个实例构造方法检查上面声明的静态实例是否为nil,如果是则新建并返回一个本类的实例
c.重写allocWithZone方法,用来保证其他人直接使用alloc和init试图获得一个新实力的时候不产生一个新实例,
d.适当实现allocWithZone,copyWithZone,release和autorelease
5.继承和类别的区别
a.联系:可以给一个类拓展的方法,或修改已有的方法
b.区别:
1.继承修改的方法不会对父类原方法产生影响;类别修改的方法相当于替换了原有方法
2.以ViewController举例,继承一个ViewController相当于建立一个新的界面;而给一个ViewController添加类别用于增加或修改原ViewController上的方法
3.类别支持开发人员针对自己构建的类,把相关的方法分组到多个单独的文件中,对于大型而复杂的类,这有助于提高可维护性,并简化单个源文件的管理
4.针对系统提供的一些类,例如:NSString,NSArray,NSNumber等类,系统本身不提倡使用继承取拓展方法,因为这些类内部实现对继承有所限制,所以最后使用类别的方法进行拓展。
5.理论上类别不能增加新属性
6.初始化构造
/*1.构造函数
a.创建对象 [类名 new] new其实是一个类方法,返回一个对象,他是在NSObject类里面的。
new方法,内部其实调用了两个方法 : alloc init
b.alloc方法 是一个类方法,返回一个当前对象。
c.init方法 是一个对象方法,返回一个当前对象
d.以下创建对象的方式是一样的。
Person * p1 = [Person new];
Person * p2 = [[Person alloc] init];
e.alloc方法是申请空间创建对象的,init是初始化对象的属性的值的。
init给对象的属性赋默认值。
oc指针 nil
c指针 NULL
bool NO
基本类型 0
现在我们不想 给这些属性赋值 赋默认值。
重写init方法。
2.重写init方法 , 有规范 (构造函数)
a.调用父类的init方法,用self接受。
b.判断这个self是否为真,如果为真,就执行自己初始化的代码。
c.返回这个self。
3.自定义构造函数: 对象方法,名字一定要initWith开头
4.代码
-(instancetype)initWithName:(NSString *)name andAge:(int)age andGender:(BOOL)gender
{
self = [super init];
if (self)
{
self->_name = name;
self->_age = age;
self->_gender = gender;
}
return self;
}
7.线程和进程的区别和联系
一个进程可以有一个或者多个线程组成
进程和程序并不是—对应的,一个程序执行在不同的数据集上就成为不同的进程,可以用进程控制块来唯一地标识每个进程。而这一点正是程序无法做到的,由于程序没有和数据产生直接的联系,即使是执行不同的数据的程序,他们的指令的集合依然是一样的,所以无法唯一地标识出这些运行于不同数据集上的程序。一般来说,一个进程肯定有一个与之对应的程序,而且只有一个。而且一个程序有可能没有与之对应的进程(因为它没有执行),也有可能有多个进程只对应(运行在几个不同的数据集上)。