zoukankan      html  css  js  c++  java
  • OC 01 类和对象

    • 一、  定义OC的类和创建OC的对象

      • 接下来就在OC中模拟现实生活中的情况,创建一辆车出来。首先要有一个车子类,然后再利用车子类创建车子对象
      • 要描述OC中的类稍微麻烦一点,分2大步骤:类的声明、类的实现(定义)。跟函数类似,函数有分声明和定义

      1.     类的声明

      1)       代码编写

      • 定义一个Car类,拥有2个属性:轮子数、时速,1个行为:跑
      • 类名属性的命名规则:标示符的规则
      • 类名的命名规范:有意义、驼峰标识、首字母大写

      #import <Foundation/Foundation.h>

      // 类的声明

      @interface Car : NSObject

      {

          @public

          int wheels; // 多少个轮子

          int speed; // 时速

      }

      - (void)run; // 跑的行为

      @end

       

      2)    成员变量

      • @interface的大括号{}中声明的变量:wheels、speed
      • @interface的大括号和函数的大括号是不一样的
      • 默认会初始化为0

       

      3)   @public

      @public可以让Car对象的wheels和speed属性被外界访问

       

      4)   NSObject

      加上:NSObject的目的是让Car类具备创建对象的能力

       

      2. 类的实现

      // 类的实现

      @implementation Car

      - (void) run

      {

          NSLog(@"%i个轮子,%i时速的车子跑起来了", wheels, speed);

      }

      @end

      3.     创建对象

      1)    代码编写

      // 主函数

      int main()

      {

          // 创建车子对象

          Car *c = [Car new];

          c->wheels = 3;

          c->speed = 300;

         

          [c run];

          return 0;

      }

      2)  main函数的代码分析、内存分析(对象在内存中有成员)

      • [Car new]每次都会创建出新的对象,并且返回对象的地址,那么就应该用一个指针变量保存对象的地址

      Car *c = [Car new];

      用一个指针变量c指向内存中的Car对象   

      • 设置车子对象的属性

      跟用指向结构体的指针访问结构体属性一样,用->

      c->wheels = 3;

      c->speed = 300;

       4. 创建多个Car对象

      • 分别只设置wheels、speed属性

      Car *c1 = [Car new];

      c1->wheels = 4;

      Car *c2 = [Car new];

      c2->speed = 250;

      [c1 run];

      • 1个赋值给另一个,然后修改属性

      Car *c1 = [Car new];

      c1->wheels = 4;

      c1->speed = 250;

      Car *c2 = c1;

      c2->wheels = 3;

      [c1 run];

      5. 面向对象封装的好处

      • 更加接近人类的思考方式
      • 只需要关注对象,不需要关注步骤

      6.     对象与函数参数

      • 对象成员变量作为函数参数
      • 指向对象的指针作为函数参数

            修改指向指向对象的成员

            修改指针的指向

      二、  类的声明和实现

      1.        @interface和@implementation的分工

       

      u  @interface就好像暴露在外面的时钟表面

      u  @implementation就好像隐藏在时钟内部的构造实现

      2.        声明和定义多个类

      3.        常见错误

      l   只有类的声明,没有类的实现

      l   漏了@end

      l   @interface和@implementation嵌套

      l   两个类的声明嵌套

      l   成员变量没有写在括号里面

      l   方法的声明写在了大括号里面

      4.        语法细节

      l   成员变量不能在{}中进行初始化、不能被直接拿出去访问

      l   方法不能当做函数一样调用

      l   成员变量方法不能用static等关键字修饰,别跟C语言混在一起(暂时忽略)

      l   类的实现可用写在main函数的后面,主要在声明后面就行了

      5.        OC方法和函数的区别

      l   OC方法只能声明在@interface和@end之间,只能实现在@implementation和@end之间。也就是说OC方法不能独立于类存在

      l   C函数不属于类,跟类没有联系,C函数只归定义函数的文件所有

      l   C函数不能访问OC对象的成员

      l   低级错误:方法有声明,但是实现的时候写成了函数

      6.   OC的方法注意

      l   方法只有声明,没有实现(经典错误)

      l   方法没有声明,只有实现(编译器警告,但是能调用,OC的弱语法)

      l   编译的时候:访问没有的成员变量直接报错,访问没有的方法,只是警告

      7.        @implementation

      • 没有@interface,只有@implementation,也是能成功定义一个类的

      @implementation Car : NSObject

      {

          @public

          int wheels; // 多少个轮子

          int speed; // 时速

      }

      - (void) run

      {

          NSLog(@"%i个轮子,%i时速的车子跑起来了", wheels, speed);

      }

      @end

      • @implementation中不能声明和@interface一样的成员变量

       

       

       

       

  • 相关阅读:
    学习:ASP.NET中App_Code,App_Data等文件夹的作用(转)
    总结:CLR Via C#(第九章):属性与索引器
    总结:CLR Via C#(第八章):其他(方法传递、out、ref)
    Init Version
    Code 128 Barcode Font Advantage Package 的常见问题
    Skelta Workflow.NET 2004 R2
    GTP.NET 甘特图项目管理控件
    Code 128 Barcode Font Advantage Package 中如何手动加入起始符,结束符,校验符
    VectorDraw Professional v5.1.1.1043
    开篇
  • 原文地址:https://www.cnblogs.com/panny/p/4096133.html
Copyright © 2011-2022 走看看