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

时间:2023-02-16 17:04:55

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

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

面向对象思想及类

 一、面向对象思想

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

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

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

    常用术语

    面向过程 Procedure Oriented

    面向对象 Object Oriented,简称OO

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

二、类

1、思想

    类和对象的关系

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

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

          名称,有意义

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

               2.不要用下划线

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

          属性

          行为

2、写一个类

 类的声明

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

格式:

@interface 类名 : NSObject

{// 声明对象属性(成员变量)

@public//允许外部访问

}

//方法声明

- (返回值类型)方法名:参数列表;

@end

举例

@interface Person :NSObject
{
@public
int age;
double weight;
}

- (void)walk;
- (void)eat;

@end


 类的实现

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

格式:

@implementation 类名

- (返回值类型)方法名
{
方法体
}

@end


 

  举例  

@implementation Person

- (void)walk
{
//成员变量作为参数传入不需要在声明中特地写出来,直接使用即可
NSLog(@"%d岁、%.1f kg的人在走路",age,weight);
}

- (void)eat
{
NSLog(@"吃了点东西");
}

@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、类的合理设计

不带参数方法

// 方法声明
- (double)pi;
// 方法实现
- (double)pi
{
return 3.14;
}

      声明

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

       实现

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

带参数方法

// 方法声明
- (double)square:(double)number;
// 方法实现
- (double)square:(double)number
{
return number * number;
}    

         声明

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

         实现

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

带多个参数的方法

// 方法声明
- (double)sumOfNum1:(double)num1 andNum2:(double)num2;
// 方法实现
- (double)sumOfNum1:(double)num1 andNum2:(double)num2
{
return num1 + num2;
}

          声明

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

 

          实现

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

方法名注意

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

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

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

#import <Foundation/Foundation.h>

@interface Car :NSObject
{
@public
int speed;
}

- (int)compareSpeedWithOther:(Car *)other;
@end

@implementation Car

- (int)compareSpeedWithOther:(Car *)other
{
//speed--当前车的speed
//other->speed--其他车的speed
return speed-other->speed;
}


@end

int main()
{
Car *c1=[Car new];
c1->speed=300;

Car *c2=[Car new];
c2->speed=200;

int deltaSpeed=[c1 compareSpeedWithOther:c2];

return 0;
}


 

10、匿名对象

 没有名字的对象,很少用

 要求至少能看懂语法

l 属性访问

[Car  new]->speed = 200;

l 方法调用

[ [Car  new]  run];