zoukankan      html  css  js  c++  java
  • 一.类和对象

    1.接口部分:对外声明类的行为和特征(类的定义分为:接口部分和实现部分)

    ① @interface 接口关键字:用于表示这是一个类的接口部分
         接口部分功能:是定义类的静态特征和声明动态行为
         @end 作为结束标志
         
         对外接口:通过接口就可以在不知道实现的情况下,了解这个类有什么
     
         Person:类名,每一个类都要起一个名字。首字母大写(类:对象的类型)
         NSObject:父类
    @interface Person: NSObject
    ②静态特征:实例变量
    ③实例变量必须在花括号中
    ④创建实例变量的时候不能被赋值
    ⑤在创建实例变量的时候,实例变量钱加“_”:系统这样写;区分;
    {
         ⑤实例变量的可见度
         《1》内部:类的实现部分使用实例变量
         《2》外部:不在实现部分使用
         《3》@public范围:外部、内部、继承
         《4》@protected(系统默认)范围:内部、继承
         《5》@private范围:内部
         //添加当前类属性
         @public//作用范围是直到下一个结束或者实例变量结束
         NSString *_name;
         NSInteger _age;
     
         @protected
         CGFloat _height;
     
         @private
         CGFloat _weight;
    }
     
    //动态行为:方法(添加类的行为)
    - (void)sayHi;
     
    @end
    2.实现部分:类行为的具体实现(方法的实现)
    ①@implementation:关键字,表示类的实现部分
         Person:类名,表示实现的是哪个类
         @end:类 结束实现标志
    @implementation Person
     
    - (void)sayHi{
         NSLog(@“Hello World”);
    }
     
    @end
    3.使用类创建对象。Objective-C中创建的对象,全部放在堆区(对象:类的实例)
    int main(){
         @autoreleasepool{
              ①申请空间
              保存空间地址
              《1》内存分配 (alloc方法:用于分配内存空间)
              Person *p = [Person alloc];
              《2》对象初始化(init方法:用于初始化对象),将内存空间数据清零
              p = [p init];
     
              《3》将创建对象的《1》和《2》合成一步
              Person *p1 = [[Person alloc] init];
     
              ②使用成员变量
              p1->_age = 10;
              p1->_name = @“贝爷”;
     
              ③使用方法
              [p1 sayHi];
         }
         return 0;
    }
    4.类是对一类具有相同事物行为和特征事物的抽象
    5.封装、继承、多态
    ①封装:将现实世界中存在的某个客体的属性与行为绑定在一起,并放置在一个逻辑单元内
    ②继承:子类自动共享父类数据结构和方法的机制,这是类之间的一种关系
    ③多态:指相同的操作或函数、过程可作用于多种类型的对象上并获得不同的结果
    6.@class的作用:只是表示有Girl这么一个类型,其他的什么都没做。在什么地方使用Girl这个类时,再导入Girl.h
    注意:我们一般选择在.h中使用@class,在.m中引入头文件
    7.组合类的使用:(指针存储对象的首地址,代指对象。OC中使用指针代指对象,进行操作)
    ①Mother.h
    #import <Foundation/Foundation.h>

    @interface Mother : NSObject
    {
        @public
        NSString *_name;
    }
    @end
    ②Father.h
    #import <Foundation/Foundation.h>

    @interface Father : NSObject
    {
        @public
        NSString *_name;
    }

    @end
    ③Child.h
    #import <Foundation/Foundation.h>

    @interface Child : NSObject
    {
        @public
        NSString *_name;
    }
    @end
    ④Family.h
    #import <Foundation/Foundation.h>
    #class Father;
    #class Mother;
    #class Child;

    @interface Family : NSObject
    {
    @public
        Father *_f;
        Mother *_m;
        Child  *_c;
    }

    @end
    ⑤main.m
            Father *father = [[Father alloc]init];
            father->_name = @"父亲";
            Mother *mother = [[Mother alloc] init];
            mother->_name = @"母亲";
            Child *child = [[Child alloc] init];
            child->_name = @"孩子";
            Family *family = [[Family alloc] init];
            family->_f = father;
            family->_m = mother;
            family->_c = child;
            NSLog(@"%@ %@ %@ ",family->_f->_name,family->_m->_name,family->_c->_name);
    8.打印字符串用“%@”做占位符。用”[]”调用方法
    有打印,没有控制台输入
    9.
    ①面向过程:编程以事件(任务)为中心,程序围绕事件,列出了事件的每个步骤,一步一步完成(侧重点:实现功能 C)
    ②面向对象:编程以事物为中心,程序围绕事物展开,完成事件只是一个小任务(侧重点:对象的特征 OC,C++,java)
    10.Objective-C中的几种方法
    ①“-”实例方法:由类的实例来执行。换言之,在调用实例方法之前,必须先创建该类的实例。实例方法是最常见的方法类型(方法只能对象使用)
    示例:- (instancetype)init;
    // 有参(1个参)无返回值
    // 冒号属于方法名的一部分
    // 方法名:printNum:
    - (void)printNum:(NSInteger)num;
    // 有两个参数
    // 方法名:printName:age:
    - (void)printName:(NSString *)name age:(NSInteger)age;

    //有三个参数
    //方法名:printName:age:score:
    - (void)printName:(NSString *)name age:(NSInteger)age score:(CGFloat)score;
    ②“+”类方法:可由它所在的类直接执行。它不需要对象的实例作为消息的接收者(方法只能被类使用)
    示例:+ (instancetype)alloc;
    注:类方法中不能使用实例变量
    11.instancetype和id区别
    ①instancetype可以返回和方法所在类相同类型的对象,id只能返回未知类型对象。
    ②instancetype只能作为返回值和参数,id还可以用来定义变量
    ③instancetype会告诉编译器当前的类型,但id对编译器却是无类型的,调用任何方法不会给出错误提示
    ④对于init方法,id和instancetype是没有区别的。因为编译器会把id优化成instancetype。当明确返回的类型就是当前class时,使用instancetype能避免id带来的编译不出错误的情况。
    12.如何获取方法名
    ①删除:类型标识,返回类型,参数类型,参数名,空格。
    示例:replaceObjectAtIndex:withObject
    注意:类中不能出现同名方法;“:”标识参数,不能省略。有冒号必须有参数;冒号属于方法名的一部分。
    13.在OC中使用消息发送机制:[receiver message]
    表述:①给receiver对象发送message消息②receiver接收到消息,即方法getSalary③receiver找到message方法,并执行
    14.setter和getter方法
    ①在OC中,为单一实例变量赋值的方法称作setter(设置器)
    ②获取单一实例变量值得方法称作getter(访问器)
    15.setter和getter方法的书写格式
    给实例变量:NSInteger _age;
    ①setter的书写格式:- (void)setAge:(NSInteger)age;
    即set+首字母大写的实例变量名(忽略下划线)
    ②getter的书写格式:- (NSInteger)age;
    j即返回值类型与变量类型一致,方法名与实例变量名相同(忽略下划线)
    16.setter和getter与实例变量的关系
    ①无论setter还是getter内部操作的是实例变量
    ②每一个实例变量都需要一对setter和getter方法
    17.setter和getter的实际操作
    ①Person.h
    #import <Foundation/Foundation.h>

    //类的接口部分
    /*
     1.定义一个类
     2.添加当前类属性(特征)
     3.添加当前类行为(方法)
     */
    @interface Person : NSObject
    {
        //大括号内部,添加当前类属性
        //字符串类型
        NSString *name;//姓名,NSString同样是一个类
        //整型
        NSInteger age;//年龄,NSInteger是数值类型,不是一种类
        //字符串类型
        NSString *gender;//性别
    }
    //初始化方法
    //希望通过初始化方法,能够获得一个Person类的实例对象,并且希望该对象具有自己的姓名属性
    - (id)initWithName:(NSString *)_name;

    //大括号外部,添加当前类行为
    - (void)sayHi;

    //设置器 setter
    - (void)setName:(NSString *)_name;
    - (void)setAge:(NSInteger)_age;
    - (void)setGender:(NSString *)_gender;

    //访问器 getter
    - (NSString *)getName;
    - (NSInteger)getAge;
    - (NSString *)getGender;

    @end
    ②Person.m
    #import "Person.h"

    @implementation Person

    - (id)initWithName:(NSString *)_name{

        //1.原始初始化,也就是将内存内的变量置零
        self = [super init];//将init方法发送给super对象
        //2.原始初始化成功之后,需要设置当前对象的姓名为形参
        if (self != nil) {
            name = _name;
        }
        //3.返回当前对象
        return self;
    }

    //大括号外部,添加当前类行为
    - (void)sayHi{
       
        //NSLog将字符串打印在控制台进行输出,类似于printf();
        NSLog(@"hello world");
    }

    //设置器 setter
    - (void)setName:(NSString *)_name{
        //设置给当前对象的属性
        name = _name;
    }
    - (void)setAge:(NSInteger)_age{
        age = _age;
    }
    - (void)setGender:(NSString *)_gender{
        gender = _gender;
    }

    //访问器 getter
    - (NSString *)getName{
        //访问当前对象的属性
        return name;
    }
    - (NSInteger)getAge{
        return age;
    }
    - (NSString *)getGender{
        return gender;
    }
    @end
    ③main.m
    #import <Foundation/Foundation.h>
    #import "Person.h"//引入类名字
    int main(int argc, const char * argv[]) {
        //1.创建Person类的实例对象
        Person *person = [[Person alloc] initWithName:@"Lewis"];//用【】调用方法
        //2.给person发送实例消息sayHi
        [person sayHi];
       
        //修改name,添加设置器(setter)与访问器(getter)
        /*
         类名    属性名  设置器方法名 访问器方法名
         Person  name  -setName:   -getName
         */
       
        //3.先打印当前person实例对象的姓名是什么
        NSLog(@"person's name is %@",[person getName]);
       
        //4.修改当前person实例对象的姓名,修改成jack
        [person setName:@"Jack"];
        NSLog(@"person's name is %@",[person getName]);
       
    }
    18.点语法(只对getter setter有效)
    s.name = @"小白";
    NSLog(@"%@",s.name);
           
    [s setAge:12];
    NSLog(@"%ld",[s age]);
    s.score = 99.99;
    NSLog(@"%.2f",s.score);
  • 相关阅读:
    哇塞 今天是数论专场呢 我要爆炸了
    树状数组模板题 hdu 1166
    [思维]Radar Scanner
    [思维]Minimum Spanning Tree
    [容斥]数对
    [概率]Lucky Coins
    [数学]特征方程求线性递推方程的通项公式
    [树状数组][2019徐州网络赛I]query
    [计算几何]Piece of Cake
    [欧拉降幂][2019南京网络赛B]super_log
  • 原文地址:https://www.cnblogs.com/good-ios/p/5172114.html
Copyright © 2011-2022 走看看