• 1.OC类


    一.基础语法

    1.在OC中,一般用2个文件来描述一个类:

    1> .h:类的声明文件,用于声明成员变量、方法。类的声明使用关键字@interface和@end。

    注意:.h中的方法只是做一个声明,并不对方法进行实现。也就是说,只是说明一下方法名、方法的返回值类型、方法接收的参数类型而已,并不会编写方法内部的代码。

    2> .m:类的实现文件,用于实现.h中声明的方法。类的实现使用关键字@implementation和@end。

    2.方法

    1> 方法的声明和实现,都必须以 + 或者 - 开头

    • + 表示类方法(静态方法)
    • - 表示对象方法(动态方法)

    2> 在.h中声明的所有方法作用域都是public类型,不能更改

    二.用 XCode创建类

    1.选择Cocoa的"Objective-C class"

    2.输入类名和选择父类

    3.创建完毕后,项目中多了两个文件

    * Student.h是类的声明文件,Student.m是类的实现文件

    * 默认情况下,这2个文件的文件名跟类名一致

    * 编译器只会编译.m文件,并不会编译.h文件

    三.写第一个类

    1.Student.h - 类的声明文件

     #import <Foundation/Foundation.h>
     
     @interface Student : NSObject
     
     @end

    1> 看第3行,OC中使用关键字@interface来声明一个类,@interface后面紧跟着类名Student。

    2> 类名Student后面的冒号":"表示继承,即第3行代码的意思是Student继承自NSObject。

    3> 因为NSObject被声明在Foundation.h中,所以在第1行用#import包含了Foundation.h文件。

    4> 第5行的@end表示类的声明结束了。@interface和@end是配套使用的。

     2.Student.m - 类的实现文件

     #import "Student.h"
     
     @implementation Student
     
     @end

    1> 看第3行,OC中使用关键字@implementation来实现一个类。@implementation后面紧跟的类名,表示究竟要实现哪一个类。

    2> 因为Student这个类是声明在Student.h中的,所以在第1行用#import包含了Student.h文件。如果你不包含Student.h,第3行代码肯定报错,因为它根本不知道Student是个什么鬼东西。

    3> 第5行的@end表示类的实现结束了。@implementation和@end是配套使用的。

    四.添加成员以及添加方法

    正常情况下,我们都是把成员变量定义在头文件中,也就是类的声明文件(.h)中

    #import <Foundation/Foundation.h>
    
    @interface Student : NSObject {
        int age; // 年龄
    }
    
    @end
    

      

    1> 第4行定义了一个int类型的成员变量age,age的默认作用域是@protected,即可以在Student类内部和子类中访问

    2> 成员变量必须写在大括号{ }里面

    五.main中实现方法

    前面我们定义了一个成员变量age,它的作用域是@protected,外界不能直接访问它。为了保证面向对象数据的封装性,我们可以提供age的get方法和set方法,让外界间接访问age。接下来在Student中添加age的get方法和set方法。

    1.在Student.h中声明方法

    #import <Foundation/Foundation.h>
    
    @interface Student : NSObject {
        int age; // 年龄
        
        @public
        int no; // 学号
        int score; // 成绩
        
        @protected
        float height; // 身高
        
        @private
        float weight; // 体重
    }
    
    // age的get方法
    - (int)age;
    
    // age的set方法
    - (void)setAge:(int)newAge;
    
    @end

    1> 第18行声明了age的get方法,方法名就叫做age,OC建议get方法的名字跟成员变量保持一致(如果是在Java中,就应该叫做getAge)

    2> 第18行最面的 - 表示这是一个动态方法( + 则表示静态方法)。age前面的(int)表示方法的返回值为int类型,方法的返回值和参数类型都需要用小括号()包住

    3> 第21行声明了age的set方法,前面的 - 表示动态方法,(void)表示方法没有返回值

    4> 在OC方法中,一个冒号:对应一个参数。由于第21行age的set方法接收一个int类型的参数,参数名为newAge,所以(int)newAge前面有一个冒号:

    5> 一定要记住:一个冒号:对应一个参数,而且冒号:也是方法名的一部分。因此第21行set方法的方法名是setAge:,而不是setAge

    再加大一下难度,假如增加一个方法可以同时设置age和height,那么就应该这样写:

    1 - (void)setAge:(int)newAge andHeight:(float)newHeight;

    * 这个方法是动态方法、没有返回值,接收2个参数,所以有2个冒号:

    * 这个方法的方法名是setAge:andHeight:

    * 其实andHeight是可以省略的,它只是为了让方法名念起来通顺一点,也让(float)newHeight前面的冒号:不那么孤单

    2.在Student.m中实现方法

    #import "Student.h"
    
    @implementation Student
    
    // age的get方法
    - (int)age {
        // 直接返回成员变量age
        return age;
    }
    
    // age的set方法
    - (void)setAge:(int)newAge {
        // 将参数newAge赋值给成员变量age
        age = newAge;
    }
    
    // 同时设置age和height
    - (void)setAge:(int)newAge andHeight:(float)newHeight {
        age = newAge;
        height = newHeight;
    }
    @end

    第6行对age方法进行了实现,第12行对setAge:方法进行了实现,第18行对setAge:andHeight:方法进行了实现

    六.创建对象

    #import <Foundation/Foundation.h>
    #import "Student.h"
    
    int main(int argc, const char * argv[])
    {
        @autoreleasepool {
            Student *stu = [[Student alloc] init];
            
            [stu release];
        }
        return 0;
    }

    ---------------------------------

    这样记笔记比较浪费时间,以后改为

    1.blog链接

    2.简述本科学习内容

    3. 问题回答

  • 相关阅读:
    php实现rpc简单的方法
    统计代码量
    laravel的速查表
    header的参数不能带下划线
    PHP简单实现单点登录功能示例
    phpStorm函数注释的设置
    数据结构基础
    laravel生命周期和核心思想
    深入理解php底层:php生命周期
    Jmeter:实例(性能测试目标)
  • 原文地址:https://www.cnblogs.com/yesihoang/p/4442046.html
Copyright © 2020-2023  润新知