黑马程序员技术交流社区

标题: 02类和对象:对象基本用法、方法的声明实现调用及命名... [打印本页]

作者: bjwqcpy@126.com    时间: 2016-10-12 23:43
标题: 02类和对象:对象基本用法、方法的声明实现调用及命名...

#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





作者: 邱中林    时间: 2016-10-13 23:47
我只是来水贴,顺便膜拜大婶的




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2