#pragma mark - Day02_01_对象的创建与使用 @interface HMPerson : NSObject { @public // 类的特征 int _age; } // 类的行为的声明 @end
@implementation HMPerson // 类的行为的实现 @end
1.语法: 类名 *对象名 = [类名 new];
2.访问对象中的成员 对象名->成员变量名称;
#pragma mark - Day02_02_犯错列表 1). 声明和实现 的 类名要一致,类名首字母必须要大写. 2). @interface下面有1个大括弧,这个大括弧中才是写属性的. 3). 属性名一定要以下划线开头. 4). 属性是指针的时候,*和属性名写在一起 5). 对象名其实是个指针变量,所以,对象的命名要遵守变量的命名规范. 7). 通过对象名来访问对象的属性的时候, 对象名->属性名; 属性名是带了下划线的 8). 默认情况下,对象的属性是不允许被外界访问的,应该加1个@public 9). 为对象的属性赋值,其实就是为对象的属性变量赋值,类型要和属性的类型一致. 10). 在类的外部不能直接操作属性,必须要创建对象,操作对象的属性. 11). 无论是为属性赋值,还是取属性的值, 都是操作的对象的属性,都要通过对象名来操作.
#pragma mark - Day02_03_无参数的方法的声明实现调用 1.方法的作用 用来描述类的行为.类似于函数,封装了一段代码,在调用的时候执行.
2.方法的定义 1) 方法的声明 a) 位置在@interface的大括号外面,在@end之前 b) - (返回值类型)方法名称; 2) 方法的实现 a) 位置在@implementation和@end之间
@interface HMPerson : NSObject { @public // 类的特征 int _age; } // 类的方法的声明 - (void)eat;
@end
@implementation HMPerson // 类的方法的实现 - (void)eat { // 方法中的代码 }
@end
3.方法的调用 1) 使用对象调用 2) 语法: [对象名 方法名]; HMPerson *laoWang = [HMPerson new]; [laoWang eat];
#pragma mark - Day02_04_带1个参数的方法的声明实现调用 1.声明格式 - (返回值类型)方法名称:(形参类型)形参名;
@interface HMPerson : NSObject { @public // 类的特征 int _age; double _weight; } // 类的方法的声明 - (void)eat;
- (void)run:(double)speed;
@end
@implementation HMPerson // 类的方法的实现 - (void)eat { // 方法中的代码 _age = 10; }
- (void)run:(double)speed { NSLog(@"以%f的速度跑", speed); }
@end
#pragma mark - Day02_05_带多个参数的方法的声明实现调用
1.声明格式 - (返回值类型)方法名:(形参类型)形参名1 :(形参类型)形参名2 :(形参类型)形参名3;
2.调用 [对象名 方法名:实参1 :实参2 :实参3];
3.注意点 OC的方法,:也是方法名的一部分 OC的方法,:也是方法名的一部分 OC的方法,:也是方法名的一部分
4.一个参数对应一个:
#pragma mark - Day02_06_方法的命名规范
// 无参数的方法 - (int)sum; // 有一个参数的方法 - (int)sumWithNum:(int)num; // 有多个参数的方法 - (int)sumWithNum1:(int)num1 andNum2:(int)num2 andNum3:(int)num3;
sumWithNum1: andNum2: andNum3:
// 无参数的方法 - (返回值类型)方法名; // 有一个参数的方法 - (返回值类型)方法名With形参的描述:(形参类型)形参名; // 有多个参数的方法 - (返回值类型)方法名With形参1的描述:(形参1类型)形参1 and形参2的描述:(形参2类型)形参2 and形参3的描述:(形参3类型)形参3;
int sum(int num1, int num2, int num3);
void main() { sum(1, 2, 3); // OC的方法相比于其他的编程语言,非常的奇葩,但是非常的通顺 [对象名 sumWithNum1:1 andNum2:2 andNum3:3]; }
#pragma mark - Day02_07_同1个类的多个对象之间毫无关系 1.使用一个类可以创建多个对象,但是它们之间是相互独立的 2.使用一个类创建的对象,具有相同的成员变量和方法,但是成员变量的值是不同的.
#pragma mark - Day02_08_在方法的实现中直接访问属性
1.相对于类的外部来说,成员变量是属于对象的. 因为我们不能直接使用类,必须要通过类创建一个具体的对象,通过对象访问对象的成员变量. 2.在类的内部,在方法的实现中,可以直接使用类的成员变量. 3.在类的外部,调用方法的时候,必须要使用一个具体的对象,调用方法.这个时候,如果在方法中使用了类的成员变量,那么通过哪个对象调用,最终就是哪个对象的成员变量.
#pragma mark - Day02_09_案例演示
#pragma mark - Day02_10_类加载(难点、重点)
1.内存的五大区域 栈区:存储局部变量 堆区:存储OC对象 BSS段:存储未初始化的全局变量 静态变量 全局区:存储已初始化的全局变量 静态变量 常量 代码区:存放代码
2.类加载 当类第一次被访问的时候,会把类对应的代码(类的声明和类的实现),加载到代码区,这个过程叫做类加载. 加载到代码去的代码,会在程序结束的时候被释放.
#pragma mark - Day02_11_对象在内存中的存储
1.类,自定义一个数据类型
2. HMPerson *p = [HMPerson new];
#pragma mark - Day02_12_对象在内存中的存储的细节 1.在堆区的对象中,只有对象的成员变量,和isa指针,没有方法.isa指针,指向代码区的类. 2.如何访问对象的成员变量? 通过p中存储的地址,访问堆区空间的对象,从而访问对象中的成员变量 3.如何访问对象的方法? 通过p中存储的地址,访问堆区空间的对象,通过对象的isa指针,访问代码区的类,调用对应的方法 4.每个对象的方法是相同的,但是每个对象的成员变量是不一样的,所以在堆区空间中,只有对象的成员变量,而没有方法. 5.使用同一个类,创建不同的对象,每个对象中的isa指针,指向的类是相同的
6.细节:HMPerson *p = [HMPerson new]; new == alloc init
HMPerson *p = [[HMPerson alloc] init];
alloc 在堆区开辟空间 init 对成员变量进行初始化
OC指针类型 nil 基本数据类型 0 C指针类型 NULL
#pragma mark - Day02_13_nil值 1. nil和NULL是完全等价的,本质上都是0 2. 如果对象的指针指向nil,访问对象的成员变量,会报错,但是调用对象的方法,不会报错,但是没有效果.
#pragma mark - Day02_14_多个指针指向同1个对象 1.类型相同的OC类型指针变量之间可以相互赋值 2.只要看到new,就说明创建了新的对象(在堆区开辟一块内存空间,根据类的定义,创建指定数量和类型的成员变量,初始化成员变量,返回对象地址)
#pragma mark - Day02_15_分组导航标记 见标题
#pragma mark - Day02_16_方法与函数 函数: 1.定义 返回值类型 函数名(参数列表); 2.位置 除了在函数内部不能定义,其它任何地方均可
3.归属感 函数是属于文件的
@interface HMDog : NSObject
void eat();
- (void)run;
@end
方法 1.定义 - (返回值类型)方法名With形参1的描述:(形参1类型)形参1 and形参2的描述:(形参2类型)形参2 and形参3的描述:(形参3类型)形参3;
2.位置 声明只能在@interface和@end之间 实现只能在@implementation和@end之间
3.归属感 方法是属于类或者对象的
#pragma mark - Day02_17_都是你的错 1.在iOS开发中,会频繁遇到一个非常经典的错误 unrecognized selector sent to instance 0x100105a80 说明对象没有实现该方法
#pragma mark - Day02_18_多文件开发 1.类的声明写在.h文件中,头文件 2.类的实现写在.m文件中
3.快捷键 新建文件: cmd + N
新建项目: cmd + shift + N
4. 在iOS项目中,参加编译的只是.m文件,.h文件不会进行编译 在使用类的时候,一定要注意,导入的是.h文件,千万不要导入.m文件,否则会出现如下错误 2 duplicate symbols for architecture x86_64 说明重复导入了.m文件
5. .h 和.m分开,可以保证代码的安全性 可以通过动态库或者静态库的技术,对.m文件进行加密,编译成一个不可逆的二进制文件,无法反编译
#pragma mark - Day02_19_对象作为方法的参数(一)
指针变量作为方法的参数
#pragma mark - Day02_20_对象作为方法的参数(二)
练习: 场景:士兵开枪发射子弹
1.定义一个枪类 Gun 1)成员变量 名称 name 子弹数量 bulletCount 2)方法 射击 shoot 枪每射击一次,子弹数量减1,打印输出剩余的子弹数量.如果子弹数量为0,提示没有子弹了.
2.定义一个士兵类 Soldier 1)成员变量 姓名 name 年龄 age 2)方法 开枪 fire 此方法需要有一个参数,传入一把枪,在开枪的方法中,调用枪的射击方法,发射子弹
公里数:mileage 品牌:brand
|