当前位置:   article > 正文

黑马程序员-iOS基础-Objective-C基础(二)面向对象思想及类_objective-c 类和对象

objective-c 类和对象

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

 黑马程序员-iOS基础-Objective-C基础(二)

面向对象思想及类

 一、面向对象思想

1、面向过程/面向对象思想

     面向过程: 关注的是解决问题需要哪些步骤

     面向对象: 关注的是解决问题需要哪些对象

    常用术语

    面向过程 Procedure Oriented

    面向对象 Object Oriented,简称OO

    面向对象编程 Object Oriented Programming,简称OOP

二、类

1、思想

    类和对象的关系

           先设计类,根据类创建对象

    如何设计类(把拥有相同或相似属性和行为的对象抽象出一个类)

          名称,有意义

               1.类名的第一个字母必须大写

               2.不要用下划线

               3.多个英文单词用驼峰标识

          属性

          行为

2、写一个类

 类的声明

作用:声明类的属性、行为

格式:

  1. @interface 类名 : NSObject
  2. {// 声明对象属性(成员变量)
  3. @public//允许外部访问
  4. }
  5. //方法声明
  6. - (返回值类型)方法名:参数列表;
  7. @end

举例

  1. @interface PersonNSObject
  2. {
  3. @public
  4. int age;
  5. double weight;
  6. }
  7. - (void)walk;
  8. - (void)eat;
  9. @end


 类的实现

指在类的声明部分中声明的类的方法的实现,也即类的方法中所包含的代码

格式:

  1. @implementation 类名
  2. - (返回值类型)方法名
  3. {
  4. 方法体
  5. }
  6. @end


 

  举例  

  1. @implementation Person
  2. - (void)walk
  3. {
  4. //成员变量作为参数传入不需要在声明中特地写出来,直接使用即可
  5. NSLog(@"%d岁、%.1f kg的人在走路",age,weight);
  6. }
  7. - (void)eat
  8. {
  9. NSLog(@"吃了点东西");
  10. }
  11. @end



 3、类的简单内存分析

 内存

        类在内存中也要占一份空间

        在使用类创建对象之前,会将类加载进内存,并且只会加载一次

        内存中只包含类内部的方法列表

 对象

        根据类创建的每一个对象,都有一个isa指针指向创建该对象的类

        调用方法的实质

           对象调用其方法,指该对象根据其内部的isa指针找到创建对象的类,在类中寻找需要调用的方法

           如果有对应方法则执行,并根据需要传入对象本身的成员变量

4、OC对象与函数

 对象成员变量作为函数参数

 指向对象的指针作为函数参数

           修改指向对象的成员

           修改指针的指向

5、类的声明和实现

        @interface和@implementation的分工

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

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

6、常见错误

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

         漏了@end

         @interface和@implementation嵌套

         两个类的声明嵌套

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

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

7、语法细节

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

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

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

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

8、OC方法和函数的区别

    OC方法

         对象方法都是以减号-开头

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

         对象方法只能由对象来调用

         对象方法归类/对象所有

    C函数

        函数能写在文件中的任意位置@interface与@end之间除外,函数归文件所有

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

       函数调用不依赖于对象

       C函数不能直接通过变量名访问OC对象的成员

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

9、类的合理设计

不带参数方法

  1. // 方法声明
  2. - (double)pi;
  3. // 方法实现
  4. - (double)pi
  5. {
  6. return 3.14;
  7. }

      声明

       实现

带参数方法

  1. // 方法声明
  2. - (double)square:(double)number;
  3. // 方法实现
  4. - (double)square:(double)number
  5. {
  6. return number * number;
  7. }    

         声明

         实现

带多个参数的方法

  1. // 方法声明
  2. - (double)sumOfNum1:(double)num1 andNum2:(double)num2;
  3. // 方法实现
  4. - (double)sumOfNum1:(double)num1 andNum2:(double)num2
  5. {
  6. return num1 + num2;
  7. }

          声明

 

          实现

方法名注意

 冒号也是方法名的一部分, 同一个类中不允许两个对象方法同名

练习:给Car类设计一个方法,用来和其他车比较车速,返回车速的差距

  1. /*
  2. 给Car类设计一个方法,用来和其他车比较车速,返回车速的差距
  3. */
  4. #import <Foundation/Foundation.h>
  5. @interface CarNSObject
  6. {
  7. @public
  8. int speed;
  9. }
  10. - (int)compareSpeedWithOther:(Car *)other;
  11. @end
  12. @implementation Car
  13. - (int)compareSpeedWithOther:(Car *)other
  14. {
  15. //speed--当前车的speed
  16. //other->speed--其他车的speed
  17. return speed-other->speed;
  18. }
  19. @end
  20. int main()
  21. {
  22. Car *c1=[Car new];
  23. c1->speed=300;
  24. Car *c2=[Car new];
  25. c2->speed=200;
  26. int deltaSpeed=[c1 compareSpeedWithOther:c2];
  27. return 0;
  28. }


 

10、匿名对象

 没有名字的对象,很少用

 要求至少能看懂语法

l 属性访问

[Car  new]->speed = 200;

l 方法调用

[ [Car  new]  run];

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/43331
推荐阅读
相关标签
  

闽ICP备14008679号