#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
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) | 黑马程序员IT技术论坛 X3.2 |