object -C 学习指导

lesson 2 类和对象的概念

all ready studied seven class. and i should review my question .

C和OC的差异
OC是面向对象的语言
核心是对象,跟符合生活逻辑,有主语

C 面向过程的语言
核心是数据和算法, 符合数学逻辑。没有主语的成数据

打地鼠的游戏 , 你怎么写?
贪食蛇, 用面向对象的思想?
蛇, 吃蛋, 移动,变长
蛋, 可以移动 可以消失,可以出现,可以被吃
地图, 可以呈现蛇和蛋

面向对象编程
1,抽象对象
2,如何设计对象
3,怎么组合。

【类和对象的概念】
人。 张三丰。郭靖
书。 我的本红皮书, 你的那本小说, 葵花宝典

人 概念性的
头发。 什么颜色?
躯干。 多长?
唱歌。 会唱什么歌?

张三丰。 // 具体的。
头发。白色
躯干 一米
唱歌。太极之歌

郭靖
头发
躯干
唱歌

人 类
头发
躯干
唱歌。 // 可以根据。这3个特镇确定是人这个类。

类和对象的关系

对象是类的具象, 他可以准确的描述出各种特征的具体样子,
类是对象的抽象, 他旨在 描述一个概念。

如果从封装的角度看
结构体, 数据的封装
函数。 逻辑的封装
类。 数据和逻辑的封装 是一种更高级的封装

类的组成
特有属性: 身高, 体重,发色
特有行为: 唱歌,跳舞,学习

成员变量 记录类的特有属性
方法(函数) 记录类的特有行为

Le

Lesson3 类和对象的语法

//
//  main.m
//  类和对象
//
//  Created by exp on 2022/4/6.
//  Copyright © 2022 exp. All rights reserved.
//

#import <Foundation/Foundation.h>

/*
  特有属性 成员变量
 特有行为  函数(类里面的函数叫方法)
 */

//类的定义
@interface Person : NSObject {
    //{}里面的内容都是负责描述类的特有属性的,称之为“成员变量”
    double _high;//描述人的身高
    double _weigt;//描述人的体重
}

// - 开头的方法, 是对象可以调用的
// + 开头的方法, 是类可以调用的

// 声明一个唱歌的方法, 可以被对象调用
// 不能在类的定义里写方法的实现
- (void)singTheSong;
//声明在类里面的函数就是方法

@end

@implementation Person

- (void)singTheSong{
    printf("人在唱歌");
}
@end


void singTheSong(int a) {
    //函数定义
}

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // 实例化一个对象  oc用【】中括号来实现函数调用
        /*
         [Person new];;
         [[Person alloc] init];
         都是动态分配一个对象的内存,并初始化
         */
        Person* xiaoMing = [[Person alloc] init];//实例化一个对象 动态分配一个对象的内存,并初始化

        //[对象 实例方法]
        //[类型 类型方法]
        //让xiaoMing调用singTheSong方法
        [xiaoMing singTheSong];

        // insert code here...
        NSLog(@"Hello, World!");
    }
    return 0;
}

Lesson4 OC工程介绍

//
//  main.m
//  了解OC的工程
//
//  Created by exp on 2022/4/6.
//  Copyright © 2022 exp. All rights reserved.
//

/*
 头文件导入
 #import 导入系统库文件 自动检查文件是否被重复导入
 #import “用户自定义文件” 先查找用户目录,然后在查找系统库
 #import <系统库文件>  直接查找系统库

 Foundation 框架 系统库包 常用的类,结构体,函数,类型,宏 使用多个。h文件声明
 Foundation.h 主头文件 里面导入了Foundation框架的所有文件
 */
#import <Foundation/Foundation.h>

/*
 C   .c
 OC   .m

 C    .h
 OC   .h
 */

// 主函数 程序的入口 唯一
int main(int argc, const char * argv[]) {
    // 自动释放池
    /*
     // 帮我清理动态分配的工厂方法创建的对象
     @autoreleasepool{//构建
         写代码
     } //销毁
     */
    @autoreleasepool {
        // insert code here...
        NSLog(@"Hello, World!"); // 快速运行 command+R, 编译程序 command+B
        // @“” OC的字符串类型 对象类型 有基本特征 有行为
        // “” C的字符串类型 集合类型
        // OC来源于 Jobs NextStep cocoa框架
        // OC没有命名空间

        //printf("Hello,work! "); 用 printf 是用来调试程序的,暴力调试程序的。
    }
    return 0;
}

Lesson5 OC类接口的分离

没人把方法和类构建在一个主文件里面。
可以使用command + N 添加一个类 class 文件。

/*
control+command+上下箭头 head&m 文件互切!
*/
按住 command 键,点击,可以查看 define定义 函数的定义。

如果用command+N 它会生成一个文件名header 和 obj函数M文件,一样的名字,类名并不需要和文件名保持一致。

//
//  main.m
//  类的接口分离
//
//  Created by exp on 2022/4/5.
//  Copyright © 2022 exp. All rights reserved.
//

#import <Foundation/Foundation.h>
// 使用import导入一个类所在的。h文件,而不是。m文件,就可以使用这个类了。
#import "Person.h"
#import "Student.h"
#import "TestOne.h"
/*
@interface Person : NSObject {
    double _high;
}

// void say hello ();
- (void)sayHello;

@end

@implementation Person

- (void)sayHello {
    NSLog(@"hello everyone ");
}

@end
*/

int main(int argc, const char * argv[]) {
    @autoreleasepool {

        Person* xiaoming = [[Person alloc] init];

        //消息机制
        [xiaoming sayHello];

        Student* mary = [[Student alloc] init];
        [mary study];

//        [mary sayHello]; //错误,学生类并没声明sayhello,方法 ,,,,so,这里不能被调用。
        // 按住 command 键,点击,可以查看 define定义 函数的定义。
    //   TestTwo* test = [[TestTwo alloc]  init];

        // insert code here...
        NSLog(@"Hello, World!");
    }
    return 0;
}
//
//  TestOne.h
//  类的接口分离
//
//  Created by exp on 2022/4/5.
//  Copyright © 2022 exp. All rights reserved.
//

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface TestTwo : NSObject

@end

NS_ASSUME_NONNULL_END
//
//  TestOne.m
//  类的接口分离
//
//  Created by exp on 2022/4/5.
//  Copyright © 2022 exp. All rights reserved.
//

#import "TestOne.h"

//类名并不需要一定和文件名保持一致。
@implementation TestTwo

@end
//
//  Student.h
//  类的接口分离
//
//  Created by exp on 2022/4/5.
//  Copyright © 2022 exp. All rights reserved.
//

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN
/*
 control+command+上下箭头
 */
@interface Student : NSObject

- (void)study;

@end

NS_ASSUME_NONNULL_END
//
//  Student.m
//  类的接口分离
//
//  Created by exp on 2022/4/5.
//  Copyright © 2022 exp. All rights reserved.
//

#import "Student.h"

@implementation Student

- (void)study {
    NSLog(@"学生在学习");
}

@end
//
//  Person.h
//  类的接口分离
//
//  Created by exp on 2022/4/5.
//  Copyright © 2022 exp. All rights reserved.
//

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

//类的声明
@interface Person : NSObject{
    double _high;
}

- (void)sayHello;

@end

NS_ASSUME_NONNULL_END
 //
//  Person.m
//  类的接口分离
//
//  Created by exp on 2022/4/5.
//  Copyright © 2022 exp. All rights reserved.
//

#import "Person.h"

//Person类的实现
@implementation Person

- (void)sayHello{
    NSLog(@"hello everyone ");
}

@end

Lesson6 Set和get的访问类&成员变量

成员变量的访问

//
//  main.m
//  成员变量的访问
//
//  Created by exp on 2022/4/5.
//  Copyright © 2022 exp. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Person.h"

// 结构体不需要加下划线
struct Student {
    char* name;
    int age;
};

int main(int argc, const char * argv[]) {
    @autoreleasepool {

        struct Student s1= {"dancer",20};
        NSLog(@"name:%s age:%d",s1.name, s1.age); // 静态的用“.”访问成员变量

        struct Student* ps1=(struct Student*) malloc(sizeof(struct Student));
        ps1->name ="mary"; // 动态的用 ”->“去访问成员变量
        ps1->age=19;

        //对象的成员变量是默认受保护的,他的权限是比结构体的更高。不能随便访问
        // init系统自带的初始化方法,默认是给基本数据类型赋值为0,或0.0,指针赋值为NULL,对象指针类型赋值为nil(给对象指针赋空值用的)
        Person* xiaoming = [[Person alloc] init]; //类构建的对象是动态分配

        //使用setter方法给小明的年龄赋值
        [xiaoming setAge:19];

        //使用getter访问小明的年龄
        int xAge = [xiaoming age];
        NSLog(@"age:%d",xAge);

        //xiaoming->_age;
        //xiaoming->_name;
        //既然对象的成员变量有访问权限,如何公开这个权限呢?
        // setter/getter方法

        // insert code here...
        NSLog(@"Hello, World!");
    }
    return 0;
}
//
//  Person.h
//  成员变量的访问
//
//  Created by exp on 2022/4/5.
//  Copyright © 2022 exp. All rights reserved.
//

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface Person : NSObject {
    char* _name;
    int _age;  //这个age有下划线,特定的
}
// getter 方法,都是带返回值的,返回类型和访问的成员变量类型保持一致。
// getter ways, all bring the value; return type and access member varible type Be consistent
-(int)age;  // 这是声明一个get方法
//避免使用get前缀,因为有特定的用法。跟你的成员变量名,保持一致,

// setter 方法,用来提供设置对象的成员变量的方法。
// 无返回值 void setAge(int age)
-(void)setAge:(int)age;
@end

NS_ASSUME_NONNULL_END
//
//  Person.m
//  成员变量的访问
//
//  Created by exp on 2022/4/5.
//  Copyright © 2022 exp. All rights reserved.
//

#import "Person.h"

@implementation Person

- (int)age {
    return  _age;  // 实现方法, 返回 _age的值
}
-(void)setAge:(int)age{
    _age = age;
}
@end

Lesson7 属性和点语法