• 02OC的类和对象


    这章重点介绍OC的类以及对象,由于C语言是面向过程语言,而OC只是对于C语言多了一些面向对象的特性,所以OC相对于其他面向对象语言,例如C#、Java等没有那么多的语法特性,所以差别还是比较大的。

    一、类的定义

    在C#中定义一个类是很简单的,直接加class关键字和一对大括号就完成了,然而,我们在OC定义一个Person类看看。

    1.在Xcode中,点击File->New File

    2、选择CoCoa下的Object-C Class

    3、输入类名Persion,选父类为NSObject、点击Next

    4、好了,我们可以看到项目多了两个文件:一个为Persion.h、一个Persion.m

    其中,Persion.h是类的声明文件,Persion.m是类的实现文件

    默认情况下,这两个文件类名要一致

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

    两个文件的分析

    在OC中定义一个类需要两个文件 .h和.m:

    Persion.h文件:

    1 #import <Foundation/Foundation.h>
    2 
    3 @interface Persion : NSObject
    4 
    5 @end

    1、放类的声明(成员变量、属性、以及方法的声明)。

    2、@interface关键字表示声明一个类,要以end结束,@interface和@end是配套使用的。

    3、NSObject是OC的基类,所有的类最终都继承于这个类(但是需要注意OC中的基类并不只有一个,例如NSProxy也是OC的基类),由于这个类在Foundation框架中定义,所以导入了<Foundation/Foundaton.h>(这么描述的意思是导入Foundation框架中的Foundation.h声明文件)。

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

    Persion.m文件:

    放属性、方法的具体实现,关键字@implementation用于实现某一个类,同时必须以@end结束,在这两个关键字之间可以放具体的属性、方法;由于.m文件使用了Persion类,所以需要导入它的声明文件Persion.h,如果不引用它肯定会报错,因为它根本不知道Persion是什么东西。 

    二、成员变量

    一般情况下,我们习惯下把成员变量定义在头文件(.h文件)中

    下面我们定义几个成员变量

    #import <Foundation/Foundation.h>
    @interface Persion : NSObject
    {
        NSString *_name;
        int _age;
        @public float _height;
    }
    @end
    

    注意点:

        1.成员变量必须定义在类后面的{}中

        2.成员变量不指定任何关键字的话是默认的级别是@Protect

        3.注意在OC中不管是自定义的类还是系统类对象,都必须是个指针,例如 _name

        4.在OC中推荐成员变量以_开头

    可访问级别有以下几种:

    @private 私有成员(当前类可以访问)

    @protected 受保护的成员(只有当前类或者子类可以访问,默认)

    @public 公共成员(任何类都可以访问)

    @package(不太常用,类似C#的internal,在框架内是公共的,在框架外是公共的)

    那既然_height是公共的,我们怎么访问它呢?

     这里需要注意几点:

    1、OC的所有对象类型都需要加上*,在OC中对象其实就是一个指针,例如之前看到的NSString也是如此,但是基本类型不用加*

    2、OC中使用[]进行方法的调用,方法调用的本质就是给这个对象或者类发送一个消息

    3、OC中对象的实例化有两个步骤:

      1是给对象对象分配存储空间;

      2是初始化对象;

    4、类的初始化会调用父类的init方法,如果使用默认初始化方法进行初始化(指的是不带参数的构造函数),这两个步骤可以简写成[Persion New]

    5、公共成员的调用使用->操作符

    三、方法和属性

    用过C#、Java的童鞋应该都知道,属性本质上来说就是Get、Set两个方法。所以方法和属性,其实是同一个事。

    下面我们看下声明方法的方式:

    实现方法的方式:

    以上不多说,虽然写法上有差别,但是应该看一下都懂的。

    在OC中方法分为静态方法和动态方法,不多说区别。方法前面加-的话,表明这个方法是动态方法,+表示为静态方法。

    如果一个方法在.h文件没有定义的话,说明是私有方法,外部无法访问。

    方法具体的调用方式:

    上面介绍了方法的调用,以及p.name这是对应属性的简写调用形式,其实这就是OC提供的一种语法糖,让我们更像C#或者JAVA那样更方便的去调用属性。俗称:OC的点语法

    好了,我们看到属性的定义以及调用了。但是每个属性都这样写,是不是很麻烦呢?有没有例如C#中prop简单点的方式呢?答案是肯定有的。

    1、在.h文件需要用关键字@property去声明

    2、在.m文件需要用关键字@synthesize去是实现

    总结下调用方式:

    1.声明了属性a,也使用了@synthesize a进行实现:但是实现过程中没有指定使用的成员变量,例如上面的两个例子,这时候编译器会使用a作为属性的成员变量(如果定义就使用定义的,没有定义就自动生成一个成员变量a,注意这个时候定义的_a跟它就没有关系了);

    2.声明了属性a,使用@synthesize a=_a:这个过程就已经指定了使用的成员变量,此时会使用指定的作为属性变量。

    3.声明了属性a,不使用@synthesize实现:编译器会使用_a作为属性的成员变量,跟这个a是没关系的。(比较拗口)

    其实在项目开发中,我们要么在@property中声明不使用@synthesize,要么使用过程中指定具体的成员变量。其实最终还是会生成getter/setter方法,只不过编译器帮我们完成了。

    总结:好了,这章主要讲OC中类、以及类中的成员变量的声明和调用。下一节我们再看看类中的其他东西,例如继承、构造函数等等东西。

  • 相关阅读:
    【ASP.NET 进阶】根据IP地址返回对应位置信息
    【网络文摘】编程的智慧
    【ASP.NET 类库】当你懒得用 Json+Ajax 时,可以试试 AjaxPro
    【iOS 初见】第一个简单的 iOS 应用
    【C#】C# 实现发送手机短信
    【网络文摘】一家公司要了你后,凭什么给你开高工资?
    深入理解Java虚拟机01--概述
    Java虚拟机(五)Java的四种引用级别
    OkHttp3源码详解(六) Okhttp任务队列工作原理
    OkHttp3源码详解(五) okhttp连接池复用机制
  • 原文地址:https://www.cnblogs.com/duyao/p/4922974.html
Copyright © 2020-2023  润新知