OC基础-day04

#pragma mark -  Day04_01_匿名对象

1. 如果函数有返回值 我们可以不使用变量接收返回值.

而是直接将函数写在要使用其返回值的地方.

 

 

 

 

2. 正常情况下.我创建对象. 是使用了1个指针保存了对象的地址.

new 实际上是1个类方法.

这个类方法的作用

-> 创建对象

-> 初始化对象

返回值是: 创建的这个对象的地址.

 

MKPerson *p1 = [MKPerson new];

我们认为,这个对象的名字就叫做p1

p1指针指向了这个对象.

 

3. 匿名对象

1) 没有名字的对象. 我们创建1个对象,不用指针去存储这个对象的地址.

[MKPerson new];

调用new方法去创建对象.但是没有使用指针来接收这个方法的返回值.

所以,创建的这个对象就没有指针指向,这个对象就没有名字.

这个对象就叫做匿名对象.

 

4. 如何使用匿名对象.

1). [MKPerson new]->_name = @"jack";

 

[MKPerson new] 这是1个方法. 这个方法的返回值就是这个对象的地址.

 

2). 调用匿名对象的方法.

[[MKPerson new] sayHi];

 

5. 匿名对象的特点:

因为匿名对象没有名字.所以这个对象只能使用1. 创建出来的时候就使用.

 

[MKPerson new]->_name = @"jack";

[MKPerson new]->_name = @"jack";

这是两个不同的独立的对象.

6. 匿名对象有什么用?

 

1). 如果1个对象的成员你只需要使用1.那么这个时候就可以使用匿名对象,但是如果这个对象你后面还想要使用.就不能使用匿名对象了.

2). 如果1个方法的参数是1个对象.而传递给这个参数的对象天生就是来传递给这个方法的.传递完毕之后.不会再使用了.那么这个时候就可以传递1个匿名对象.

 

#pragma mark - Day04_02_面向对象的三大特征

1)封装:

现实生活中的封装: 将很多的小东西 塞在1个大口袋里面.

好处:

a. 对外部屏蔽.

b. 方便管理.

 

代码的封装:

函数/方法 就是1种封装的体现: 将一段代码塞在函数/方法中.

好处: 屏蔽了内部的实现. 便于管理.

 

类是一种更高级别的封装:

1个类中封装数据的状态和行为.

将数据的状态和行为封装在了1个类中. 类中有很多复杂的实现. 对于外部而言无需关心.

 

2)继承:

3)多态:

 

 

 

#pragma mark - Day04_03_使用setter方法来对属性赋值做逻辑验证

原因

 

 

为对象的属性赋值的时候,语法上只要赋值1个和属性的类型相同的数据都是可以的

但是情理上.你不能为对象的属性随意赋值.

 

 

封装

 

 

1). 要解决什么问题: 要求为对象的属性赋值的时候,赋值的数据要有限制.要经过我们的逻辑判断.

 

2). 靠谱的解决方案:

        1. 先把类的属性的@public修饰符去掉.

 

        2. 为类提供1个方法.这个方法的作用 专门用来为对象的属性赋值. setter

 

3setter方法特点

a.  这个方法一定是1个对象方法.

b.  这个方法肯定没有返回值.因为这个方法做的事情就是为属性赋值.

c.  这个方法的名字必须以set开头.再跟上这个属性的名字,去掉下环线,首字母大写.

d.  这个方法一定有参数,参数的类型和属性的类型一致,参数名和属性名一致.只是去掉下划线.

e.  在方法的实现中,判断参数的值是否符合逻辑.如果符合就将其赋值给属性,否则做默认处理.

f.  外界如果想要为对象的属性赋值,是不能直接访问属性了,外界只能调用这个setter方法来为对象的属性赋值,而这个时候,setter方法对准备赋值的数据做了逻辑判断,如果符合逻辑就会赋值给对象的属性.否则就不会.

 

 

#pragma mark - Day04_04_getter方法取到对象的属性的值

 

1 当我们吧@public去掉之后,想要取出对象的属性的值,也取不出来.因为属性根本就没有权限访问了,所以需要为类再提供1个方法. 这个方法专门用来返回对象的属性的值,这个方法我们叫做 getter

 

2getter方法特点

a.  这个方法一定是1个对象方法,因为方法要访问当前对象的属性的值 并返回

b.  这个方法必须有返回值.返回值的类型肯定是和属性的类型一致.

c.  这个方法的名字 就是 这个属性的名字,去掉下划线.

d.  这个方法一定是没有参数的.

e.  这个方法的实现,很简单, 就是直接返回当前对象的属性的值.

f.  这个时候,外界如果想要得到对象的属性的值,就只能必须调用对象的getter方法来拿到了.

 

"练习

创建一个类 人类

属性 姓名 年龄 性别 存款

 

提供这4个属性的getter setter

并且获取对象的存款属性时 当存款大于100W 返回时存款的0.1

并提供两个类方法

快速创建方法 快速创建方法并设置属性的方法

 

 

 

 

#pragma mark - Day04_05_属性封装的规范

1. 只读与只写封装.

1).  如果属性的封装只有getter 没有setter

那么这样的封装我们就叫做只读封装.

就只能调用getter方法取值.不能调用setter方法赋值. 因为没有setter方法.

 

2).  只写封装.

属性的封装只有setter 没有getter

那么这样的封装我们就叫做只写封装.

就只能调用setter方法赋值.不能调用getter方法取值.因为美哦有getter方法

 

2. 属性封装的规范.

 

只要属性需要被外界访问.无论取值或者赋值的时候,是否有逻辑验证.

都要为其封装gettersetter.

 

 

 

#pragma mark - Day04_06_类与类之间的关系

1. 组合关系.

1个对象是由多个对象组合起来的.

比如.计算机对象. 是由主板对象、CPU对象、内存对象、硬盘对象...组合起来的.

主板、内存、硬盘作为计算机对象的属性.

那么这个时候,计算机对象和主板、内存、硬盘的关系为 组合关系.

 

2. 依赖关系

1个对象的方法的参数是另外1个对象.那么我们就说他们的关系是依赖关系.

 

耦合度当修改1个对象的时候 对另外1个对象的影响程度.

A类和B. 如果修改了B. 发现A类就无法使用了,我们就说他们的耦合度很高.

 

低耦合: 当修改1个对象的时候 对另外1个对象的影响较小甚至没有影响.

高内聚: 1个对象仅仅做自己相关的事情. 跟自己无关的事情就不要写在类中.

单一职责原则. 1个类只做自己的事情.别人的事情给别人做.

 

3. 关联关系

关联体现的是两个类之间语义级别的一种强依赖关系,

比如我和我的朋友,这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,一般是长期性 的,

而且双方的关系一般是平等的。关联可以是单向、双向的。

表现在代码层面,

为被关联类B以类的属性形式出现在关联类A中,也可能是关联类A引用了一个类 型为被关联类B的全局变量。

 

#pragma mark -  Day04_07_士兵突击

1. 士兵突击:

使用面向对象模拟: 士兵开枪,枪射出子弹.

找类:

士兵类:

属性:姓名 兵种 🔫

行为:开枪.

 

枪类:

属性: 型号,颜色,子弹数量.

行为: 射击

 

#import <Foundation/Foundation.h>

#import "MKGun.h"

 

 

@interface MKSoldier : NSObject

{

    /**

     *  士兵对象的姓名属性

     */

    NSString *_name;

    

    /**

     *  士兵对象的兵种

     */

    NSString *_type;

    

    

    /**

     *  士兵对象的枪对象.

     */

    MKGun *_gun;

}

 

- (void)setName:(NSString *)name;

- (NSString *)name;

 

- (void)setType:(NSString *)type;

- (NSString *)type;

 

- (void)setGun:(MKGun *)gun;

- (MKGun *)gun;

 

/**

 *  士兵开枪的方法.

 */

- (void)fire;

 

@end

 

@implementation MKSoldier

- (void)setName:(NSString *)name

{

    _name = name;

}

- (NSString *)name

{

    return _name;

}

 

- (void)setType:(NSString *)type

{

    _type = type;

}

- (NSString *)type

{

    return _type;

}

 

- (void)setGun:(MKGun *)gun

{

    _gun = gun;

}

- (MKGun *)gun

{

    return _gun;

}

 

/**

 *  士兵开枪的方法.

 */

- (void)fire

{

    //开自己的那把枪.

    NSLog(@"冲啊!!!!为了新中国!记得我叫%@",_name);

    

    [_gun shoot];

    

    

}

@end

 

 

/**

 *  🔫

 */

@interface MKGun : NSObject

{

    /**

     *  🔫对象的型号

     */

    NSString *_model;

    

    /**

     *  🔫对象的颜色

     */

    NSString *_color;

    

    /**

     *  🔫对象子弹剩余的数量.

     */

    int _bulletCount;

}

 

- (void)setModel:(NSString *)model;

- (NSString *)model;

 

- (void)setColor:(NSString *)color;

- (NSString *)color;

 

- (void)setBulletCount:(int)bulletCount;

- (int)bulletCount;

 

+ (MKGun *)gunWithModel:(NSString *)model andColor:(NSString *)color andBulletCount:(int)bulletCount;

/**

 *  射击的行为

 */

- (void)shoot;

@end

 

@implementation MKGun

 

+ (MKGun *)gunWithModel:(NSString *)model andColor:(NSString *)color andBulletCount:(int)bulletCount

{

    MKGun *gun = [MKGun new];

    [gun setModel:model];

    [gun setColor:color];

    [gun setBulletCount:bulletCount];

    return gun;

}

 

- (void)setModel:(NSString *)model

{

    _model = model;

}

- (NSString *)model

{

    return _model;

}

 

- (void)setColor:(NSString *)color

{

    _color = color;

}

- (NSString *)color

{

    return _color;

}

 

- (void)setBulletCount:(int)bulletCount

{

    _bulletCount = bulletCount;

}

- (int)bulletCount

{

    return _bulletCount;

}

 

/**

 *  射击的行为

 */

- (void)shoot

{

    //1. 先判断当前🔫对象的子弹够不够.

    if(_bulletCount <= 0)

    {

        //说明子弹不够

        NSLog(@"突不了,因为没有子弹了.");

    }

    else

    {

        NSLog(@"突突突突");

        _bulletCount--;

        NSLog(@"%@还剩%d发子弹.",_model,_bulletCount);

    }

}

@end

 

 

 

#pragma mark - Day04_08_Xcode文档的安装

1. Xcode内置了很多很多的框架.

框架中有类、函数、数据类型.

类是占多数的. 1个类都有非常牛X的功能

 

问题

1). 我如何知道到底有哪些框架呢?

2). 我如何知道框架中有哪些类呢?

3). 我如何知道每1个类有什么功能?

4). 我如何知道类中的方法是来做什么事情的呢?

 

2. 苹果提供了1份非常详尽的文档.把这些问题都解决了.

文档详细的说明了:

有哪些框架、框中中有哪些类.类的作用.类的方法的功能.

 

3. 安装的方式

 

1). 在线安装

2). 离线安装

/Applications/Xcode.app/Contents/Developer/Documentation/DocSets

 

4. 使用方法

1). 在代码中选择1个类或者方法.在属性检查窗口 就会显示他的说明.

2). 按住opt 点击.

3). 直接去文档找 .

 

 

#pragma mark - Day04_09_static关键字

 

1. C语言中学习到的static

a. 修饰局部变量,将局部变量变为静态变量.

b. 修饰全局变量.

c. 修饰函数.

 

2. OCstatic也可以使用.

a. static不能修饰类的属性.

b. static也不能修饰方法.

c. 方法中的局部变量,可以被static修饰,就会将这个变量变为静态变量.在方法执行完毕之后不会被回收, 下次再去执行的时候直接拿过来使用.

 

C语言中修饰局部变量的效果一样.

 

3. 什么时候要定义静态变量.

如果希望无论方法被执行多少次,变量只有1 那么就搞成静态的.

 

 

 

#pragma mark - Day04_10_在对象方法中使用self

 

1. self关键字.

        1) self关键字可以用在对象方法和类方法中.

 

        2) self1个指针.

        在对象方法中,self指向当前对象.

        在类方法中,self指向当前类.

 

2. 在对象方法中使用self

        1). self1个指针. 在对象方法中指向当前对象.

        什么叫做当前对象? 谁调用这个对象方法.谁就是这个对象方法的当前对象.

        2). 在对象方法中使用self有什么用

 

        在对象方法中,可以使用self关键字来显示的访问当前对象的成员.

        a. 可以使用self关键字显示的访问当前对象的属性.

        b. 可以使用self关键字显示的调用当前对象的其他的对象方法.

 

        3). 在对象方法中使用self的场景

 

                a. 必用场景.

                -> 如果方法中存在和属性同名的局部变量.这个时候直接写这个变量名访问的是这个局部变量.

                如果你就是要访问属性.就必须使用self

 

                -> 在对象方法中如果要调用当前对象的其它的对象方法.必须使用self.否则不行.

                如果你重新对象,调用这个对象的方法,那就不是当前对象的方法了.

 

                b. 选用场景

                在方法中如果没有和属性同名的局部变量.这个时候要访问属性的时候,可以直接写属性名,也可以加self

 

                c. 注意

                属性的名字才以下划线开头.局部变量的名字就不要以下划线开头.

                如果你按照这个规范来写.是不会重名的.

 

 

#pragma mark - Day04_11_在类方法中使用self

 

 

在类方法中使用self

        1). 类加载.

        当类第一次被访问的时候,就会将这个类存储在代码段.一旦存储 直到程序结束的时候,才会被释放.

        2). 在类方法中self也是1个指针. 这个指针指向当前这个类在代码段中的地址.

        3). 如何拿到类在代码段中的地址.

        a. 查看对象的isa指针.

        b. 在类方法中查看self的值.

        c. 调用对象的方法class. 也可以得到这个对象所属的类的地址.

        d. 调用类的类方法class 也可以得到这个类所在的地址.

        4). 我们现在知道: 在类方法中,self确实是指向当前这个类的.

        在类方法中,self代表当前这个类.

        我们可以这么认为:

        self 就是当前类.

        当前类和self完全等价.

        在类方法中,可以使用当前类的地方.完全可以使用self来代替.

 

        在类方法中,可以使用self来代替当前类.使用当前类的地方,可以使用self来代替.

        比如: 要调用当前类的其他的类方法. 就可使用slef来调用.

        再比如: 在类方法中创建当前类的对象的时候,也可以用self来代替.

        [self new];

 

        self本身是1个指针,不是类型,所以比不能使用self来声明变量.

 

 

 

 

#pragma mark -  Day04_12_使用self总结

 

1). self关键字可以使用在对象方法和类方法中.

 

2). 在对象方法中,self代表当前对象.

可以使用self来显示的访问当前对象的成员.

可以用self来访问当前对象的属性 调用当前对象的对象方法.

注意: 在对象方法中不能使用self来调用类方法. 因为类方法必须要使用类名调用,而这个时候.self不代表当前类

 

 

3). 在类方法中,self代表当前类.

可以使用self来调用当前对象的类方法.

注意: 在类方法中,不能使用self访问属性调用对象方法 .

 

 

"练习

创建一个人类

属性  姓名 年龄

 

封装getter setter

 

对象方法

1.吃零食

2.看电视 (需要调用吃零食方法)

 

类方法

1.快速创建对象

2.快速创建对象并设置属性

 

#pragma mark - Day04_13_继承的简单使用

 

1)继承的作用

儿子类想要拥有爹类中的所有的成员,但是不想自己去定义,而是想凭空拥有,那么这个时候 就可以让儿子类从爹类继承.

 

2)继承的语法

@interface 类名 : 它爹的名字

 

@end

@implementation 类名

 

@end

 

在声明类的时候.在类名的后面,写上父类的名称.

 

 

3 继承的效果:

儿子类可以继承父亲类中的所有的成员.

儿子类就无条件拥有父亲类中的所有的成员 而不用自己去定义.

 

4 几个专业术语.

 

@interface MKStudent : MKPerson

@end

MKStudent类从MKPerson类继承

MKStudent类是MKPerson类的子类

MKPerson类是MKStudent类的父类

MKStudent类从MKPerson类派生

MKStudent类是MKPerson类的派生类

MKPerson类是MKStudent类的基类

 

 

 

 

 

#pragma mark - Day04_14_继承是类在继承而不是对象在继承

1.  继承是类在继承,而不是对象在继承.

对象与对象之间是毫无关系的.

继承: 是子类模板中拥有了父类模板中的成员.'

 

 

虽然是继承,但是用父类创建出来的对象,和用子类创建出来的对象没有任何关系

 

继承.

子类从父类继承,就相当于子类中拥有了父类中的所有成员.

 

 

#pragma mark - Day04_15_什么时候应该使用继承

 

什么时候应该使用继承.

1). 当你发现A类中的成员,B类也想拥有. 就让B继承A.

切记: 不要为了继承而继承.不要为了仅仅是得到某个类的成员就去继承.

2). 只有满足is a关系的两个类才可以继承.

A类是1B类的时候 那么这个时候A类才可以从B类继承.

 

'继承强调的是: 家族

 

 

 

 

#pragma mark - Day04_16_只要成员不是所有的子类都拥有的就不应该定义在父类中

 

'只要有1个成员不是所有的子类都拥有的,那么就不应该讲这个成员定义在父类中.

 

 

 

#pragma mark - Day04_17_继承的特点

1. 继承.

        1). 继承有什么用?

        子类从父类继承,就意味着子类中拥有了父类中的所有的成员 而不用自己定义.

        2). 什么时候要使用继承呢?

        a. 当多个类具有相同的成员的时候.那么你就可以考虑为他们找1个共同的爹.

        b. 父类和子类的关系 要满足is a的关系.

        3). 父类中只定义所有的子类都拥有的成员.

 

2. 继承的特点

        a. 单根性

        OC中的类有且只能有1个父类. 不能从多个父类继承.

        b. 传递性

        A类从B类继承, B类从C类继承,

        A类就同时拥有B类、C类的所有的成员.

 

 

 

 

定义类

创建一个人类

        属性  姓名 年龄

 

        封装getter setter

 

        对象方法

        1.吃饭

        2.睡觉

 

        类方法

        1.快速创建对象

        2.快速创建对象并设置属性

 

职员类 继承 人类

        属性 公司 薪水

 

        类方法

        1.快速创建对象

        2.快速创建对象并设置属性

 

        对象方法

        1.上班

        2.领工资

 

老师类 继承 职员类

        属性 职称

 

        对象方法

        1.教学生(给他一个学生对象,让学生学习)

        2.加班

 

        类方法

        1.快速创建对象

        2.快速创建对象并设置属性

 

学生类 继承 人类

        属性 学号

 

        对象方法

        1.学习(调用熬夜方法)

        2.熬夜

 

        类方法

        1.快速创建对象

        2.快速创建对象并设置属性

 

 

 

需求

每个对象都创建一个

然后把每一个对象的属性都设置上数值

 

.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2016-07-26 15:16  MK王月  阅读(169)  评论(0编辑  收藏  举报