--------------static和extern----------
static 和 extern都是用来修饰变量(局部的static实际也是全局的)
static修饰的变量 只有你的包含那个变量定义的源代码文件可以访问(内部的变量)
extern定义的变量的哪个源文件都可以访问 只要声明了就可以(外部变量)
-------------static对局部变量的作用
1、延长局部变量的生命周期,从程序启动到程序退出,但是它并没有改变变量的作用域
2、定义变量的代码在整个程序运行期间仅仅会执行一次
extern 不是定义局部变量,它用在函数内部是声明一个全局变量
------------static 与 extern对全局变量的作用
全局变量分两种
内部变量:static修饰的,默认下,只能在本文件中访问的变量
外部变量:extern修饰的,默认下,所有的全局变量可以被其他文件访问(有包含关系)
----static作用
声明一个内部变量
定义一个内部变量
由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。
注意:在不同文件中可以定义同名的内部变量,互不影响
---------extern作用
完整定义一个外部变量
完整声明一个外部变量
注意:
1) 在不同的文件中不可以定义同名的外部变量
---------static 与 extern对函数的作用
假设有A、B两个文件
内部函数:在A文件中定义的函数,在A文件中访问
外部函数:在B文件中访问A文件中定义的函数,函数在B中称之为 外部函数
extern修饰函数声明为外部函数
static修饰函数声明为内部函数
-------------import和include的区别;
include 和 import 都是引入头文件
import引入的头文件,可以防止重复包含
include它是使用预处理指令防止重复包含,如果没有写预处理指令,则无法防止重复包含问题
--------------NSLog 和printf的区别:
1,NSLog可以自动换行, 输出调试信息, printf不能.
2,NSLog 函数的参数是一个NSString 对象
3,printf函数的参数是一个字符串常量指针
-------------依赖关系
A对象作为B对象的局部变量或是方法形参的,B依赖与A,这时候我们称A与B之间存在一种依赖关系
-----------关联关系,HasA关系:
当一个对象拥有另外一个对象的时候, 当B对象为A对象的成员变量的时候,B对象与A对象之间存在一种关联关系
------------------self和super&static:
self和super:
self应用场景:
1)用在类方法中 2)用在对象方法中 3)访问成员变量 4)self在OC的内存管理特殊使用
1. self理解: 谁调用当前方法, self就代表谁.
比如: 在对象方法中,self代表的是对象, 因为只有对象才可以调用对象方法
在类方法中, self代表的是类, 因为只有类名才可以调用类方法.
注意: 在对象方法中不要使用self调用类方法
在类方法中不要使用self调用对象方法
2. 在对象方法中可以通过 self->_speed访问成员变量.
3. super代表的是当前类的父类.
----------super 的作用
1.直接调用父类中的某个方法
2.super 处在对象方法中,那么就会调用父类的对象方法
super 处在累方法中,那么就会调用父类的类方法
3。使用场合:子类想重写父类的一些方法时想保留一些父类的行为
-----static关键字:可以使局部变量保留多次调用一个方法所得的值
1. 在c语言中 static可以修饰局部变量、全局变量、函数
2. 在OC中, 不能用来修饰实例变量和方法, 但是可以修饰局部变量, 全局变量
--------------id和instancetype类型区别
1. id和instancetype都可以用来作为方法的返回值
2. id可以用来定义类型,instancetype不能用来定义类型
id obj;
instancetype obj2; // 错误
3. instancetype可以精确返回值类型
-------------分类与继承的区别-----------------
.类别(category)又叫分类,可以在不改变类名和原来类的实现的前提下,实现对类的方法扩展。
分类不可以增加成员变量,可以增加方法;
Category可以重载原始类的方法,直接替换掉原来的方法,后果是再也不能访问原来的方法
类别文件命名时,是原类名+扩展标识名
格式例:
@interface Student: NSObject -(void) print; @end 声明文件Student+Play.h #import "Student.h" @interface Student(Play) -(void)play; @end 实现文件Student+Play.m #import "Student+Play.h" @implementation Student(Play) -(void)play{ NSLog(@"Student-->play"); } @end
2.继承,抽取相同代码,建立了类之间的关系,不改变原来模型的期初上,拓充方法。
子类继承父类,拥有父类的属性,也可以增加成员变量和方法
子类重新实现父类中的某个方法,覆盖父类以前的做法
格式例:
@interface Person: NSObject // 父类声明 @end @interface Student : Person @end