1. 类的定义
为类定义属性的时候,以_开头
-> 类的声明
@interface 类名:NSObject
{
这类事物具有的共同的特征,将他们定义为变量
}
功能就是1个方法,将方法的声明写在这里
@end
-> 类的实现
@implementation 类名
将方法的实现写在这里
@end
2. 类的对象
类名 *对象名=[类名 new];
Person *p1=[Person new];
3. 对象的属性
a. 默认情况下,对象的属性是不允许被外界直接访问的
如果允许对象的属性可以被外界访问,那么就再声明属性时加1个@public
关键字
b. 访问对象的属性的方式
对象名->属性名=值;
对象名->属性名;
(*对象名).属性名;
平常使用的时候,使用->
4. 无参数方法
声明:
- (返回值类型)方法名称;
- (void)run;
表示声明了1个无返回值并且无参数的方法
实现:
- (void)run
{
..
}
调用:
[对象名 方法名];
5. 带1个参数法方法
方法头中的数据类型 都要用1个小括弧括起来
声明:
- (返回值类型)方法名称:(参数类型)形参名称;
- (void)eat:(NSString *)foodName;
实现:
调用:
[对象名 方法名:实参]
6. 带多个参数的方法
声明:
- (返回值类型)方法名称:(参数类型)形参名称1 :(参数类型)参数名称2 :(参数类型)参数名称3;
- (int)sum:(int)num1 :(int)num2;
实现:
调用:
[对象名 方法名:实参1 :实参2 :实参3];
7. 带参数的方法声明的规范
a. 如果方法只有1个参数,要求最好这个方法的名字叫做xxxxxxWith 或 xxxxxWithxxxxxx
b. 如果方法多个参数 建议这个方法名称:
方法名With:(参数类型)参数名称 and:(参数名称) and:(参数类型)参数名称;
- (int)sumWith:(int)num1 and:(int)num2;
方法名With:(参数类型)参数名称 and:(参数类型)参数名称 and:(参数类型)参数名称;
and也可以换成其他任何英语单词:
- (int)sendWithMessage:(int)num1 toNumber:(int)num2;
8.内存中的五大区域
内存中的五大区域 | 作用 |
---|---|
栈 | 存储局部变量 |
堆 | 程序员手动申请的字节空间 malloc calloc realloc函数 |
BSS段 | 存储未被初始化的全局变量 静态变量 |
数据段(常量区) | 存储已被初始化的全局 静态变量 常量数据 |
代码段 | 存储代码 存储程序的代码 |
-
在创建对象的时候 ,肯定要访问类的
-
声明1个类的指针变量也会访问类的
在程序运行期间 ,当某个类第1次被访问到的时候,会将这个类存储到内存中的代码段区域,这个过程叫做类加载只有类在第1次被访问的时候,才会做类加载
一旦类被加载到代码段以后,直到程序结束的时候才会被释放
9. 对象在内存中究竟如何存储的
假设下面这个写在函数之中:
Person *p1=[Person new];
-
Person *p1;会在栈内存中申请1块空间,在栈内存中声明1个Person类型的指针变量p1,p1是1个指针变量,只能存储地址
-
[Person new]; 真正的内存中创建对象的其实是这句
new做的事情:
a. 在堆内存中申请1块合适大小的空间
b. 在这个空间中根据类的模板创建对象
类模板中定义了什么属性,就把这些属性依次的声明在对象之中
对象中还有另外1个属性,叫做isa 是1个指针,指向对象所属的类在代码段中的地址
c. 初始化对象的属性默认值
如果属性的类型是基本数据类型 ,那么就赋值为0
如果属性的类型是C语言的指针类型 那么就赋值为NULL
如果属性的类型是OC的类指针类型 ,那么就赋值为nil
d. 返回对象的地址 -
注意
a. 对象中只有属性 ,而没有方法,自己类的属性外加1个isa指针指向代码段中的类
b. 如何访问对象的属性
指针名->属性名;
根据指针 找到指正指向的对象 再找到对象中的属性来访问
c. 如何调用方法
[指针名 方法名]
先根据指针名找到对象,对象发现要调用方法 再根据对象的isa指针找到类 然后调用类里的方法
d. 指针变量放在栈里,对象的属性放在堆里面,类的方法放在代码段里,方法不存储在对象之中
10. NULL与nil
-
NULL
NULL,代表这个指针不指向内存中的任何1块空间
NULL其实等价于0 NULL其实是一个宏,就是0 -
nil
只能作为指针变量的值,代表这个指针变量不指向任何对象
nil其实等价于0 ,其实是一个宏,就是0
所以NULL和nil其实是一样的
一般:C指针用NULL,OC指针用nil
11. 分组导航标记
会在导航条对应位置生成1个标记
#pragma mark 狗狗的声明
会在导航条对应位置生成一条水平线
#pragma mark -
会在导航条对应位置先生成一条水平线,再产生一个标记
#pragma mark - 狗狗的声明
12.OC方法与C函数
OC方法的声明只能写在@interface的大括弧外面,实现只能写在@implementation之中
函数除了在函数的内部和@interface的大括弧之中,其他地方都可以写
就算把函数写在类中,函数也不属于这个类,所创建的对象也没有这个函数