【Objective-C】OC前置知识


接下来,我会跟着实验室规划的路线开始学习OC语言,学习之前,先了解一下 Objective-CC语言的关系以及面向对象编程语言的一些关键概念。

跟C++类似,Objective-C是C语言的严格超集——任何C语言程序不经修改就可以直接通过Objective-C编译器,也就是说OC是兼容C语言的。

Objective-C被描述为盖在C语言上的薄薄一层,因为Objective-C的原意就是在C语言主体上加入面向对象的特性。


我的第一个Objective-C程序

#import <Foundation/Foundation.h>

int main(int argc, char *argv[]) {

    @autoreleasepool {
        NSLog(@"Hello World!");
    }

   return 0;
}

#import和主头文件

#import <Foundation/Foundation.h>

这条语句是为了导入头文件。
#import 导入系统库文件 自动检查文件是否被重复导入
#import "用户自定义文件" 先检查当前目录,再查找系统库
#import <系统库文件> 直接访问系统库
Foundation框架 系统库包 常用的类、结构体、函数、类型、宏 使用多个.h文件声明
Foundation.h主头文件 里面导入了Foundation框架里的所有头文件

自动释放池
在这段OC代码中,看到了这一前所未见的语句:

@autoreleasepool {
}

C语言,特别是在应用层程序员使用得比较少的原因是指针(内存管理)十分地复杂,会经常出现诸如野指针、内存没有回收、内存泄露的情况,而且特别难Debug,而OC是基于C语言的,也会出现这种情况,

因此OC借鉴了Java的JVM虚拟机垃圾自动收集机制,升级了内存管理,很大程度上解放了程序员对指针的管理。对于自动释放池@autoreleasepool包含的代码,都会受到这样的一个机制的管理,编译器自动帮我们添加无用对象回收。

当然,ta的原理机制跟JVM不一样,JVM是运行时动态监测,OC时在编译时帮助我们替对象回收代码,帮我们清理动态分配的(工厂方法创建的、自动释放池对象)对象,注意⚠️不是所有对象。

NSLog日志输出函数

NSLog(@"Hello World!");

NSLog是Foundation库提供的打印方法,打印一个字符串@"Hello World!",与C语言的字符串的区别是会在末尾打印一个回车且多了一个@,这个是OC的指定符,表示这是一个对象,从而将后面的"Hello World!"转化成NSString不可变对象。
作用:这个函数相当于C语言中的printf函数的增强版。向控制台输出信息。

那么相对于printf函数,它增强的地方有哪些?

  1. 会显示程序代码执行的时间(时间戳);
  2. 会显示工程文件的名称;
  3. 会显示内存的进程编号和线程编号;
  4. 会自动换行;

OC中新增了一些数据类型(Foundation框架),这些新增的数据类型只能使用NSLog输出。
NSLog的用法和printf基本相似,一样可以输出变量的值,并且占位符的用法也一样,但是要注意

  • NSLog函数的第一个参数前面必须要加一个@符号(@""表示这是OC的字符串NSString)
  • 如果在字符串的末尾加了一个’\n’,那么NSLog函数的自动换行功能就会失效。

认识面向对象与面向对象

先来看看某百科给出的定义:
请添加图片描述

看看👀,这说的是人话吗?!

通俗解释:

面向过程(Procedure Oriented 简称PO :如C语言):

从名字可以看出它是注重过程的。当解决一个问题的时候,面向过程会把事情拆分成: 一个个函数和数据(用于方法的参数) 。然后按照一定的顺序,执行完这些方法(每个方法看作一个过程),等方法执行完了,事情就搞定了。

面向对象(Object Oriented简称OO :如C++,JAVA等语言):

看名字它是注重对象的。当解决一个问题的时候,面向对象会把事物抽象成对象的概念,就是说这个问题里面有哪些对象,然后给对象赋一些属性和方法,然后让每个对象去执行自己的方法,问题得到解决。

以下实例说明两者的区别。

面向过程的设计思路就是首先分析问题的步骤:

1、开始游戏,2、黑子先走,3、绘制画面,4、判断输赢,5、轮到白子,6、绘制画面,7、判断输赢,8、返回步骤2,9、输出最后结果。把上面每个步骤用不同的方法来实现。

面向对象的设计则是从另外的思路来解决问题:

整个五子棋可以分为1、黑白双方,这两方的行为是一模一样的,2、棋盘系统,负责绘制画面,3、规则系统,负责判定诸如犯规、输赢等。第一类对象(玩家对象)负责接受用户输入,并告知第二类对象(棋盘对象)棋子布局的变化,棋盘对象接收到了棋子的变化就要负责在屏幕上面显示出这种变化,同时利用第三类对象(规则系统)来对棋局进行判定。

可以明显地看出,面向对象是以功能来划分问题,而不是步骤。同样是绘制棋局,这样的行为在面向过程的设计中分散在了多个步骤中,很可能出现不同的绘制版本,因为通常设计人员会考虑到实际情况进行各种各样的简化。而面向对象的设计中,绘图只可能在棋盘对象中出现,从而保证了绘图的统一。

解决同一个问题 ,面向对象编程就是先抽象出对象,然后用对象执行方法的方式解决问题。

总结来说:

面向过程

优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、 Linux/Unix等一般采用面向过程开发,性能是最重要的因素。

缺点:没有面向对象易维护、易复用、易扩展

面向过程编程的核心是数据与算法,符合数学逻辑

面向对象

优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统 更加灵活、更加易于维护

缺点:性能比面向过程低

面向对象编程的核心是解决问题的实体(对象)更符合生活逻辑

面向对象的关键概念

一、对象或实例:对象是由数据及其操作所构成的封装体,是系统中用来描述客观事物的一个封装,是构成系统的基本单位,采用计算机语言描述,对象是由一组属性和对这组属性进行操作的一组服务构成
二、类:面向对象实现对客观实体的直接映射,抽象出同一类实体共有的行为特征就是类。而类体主要包含两大部分:成员变量成员方法

类也可以嵌套,嵌套在另一个类定义中的类是内部类,而含有内部类的类是外部类
类是对象(实例)的抽象,实例是对象的具象

三、成员属性:出现在类体中,方法之外的就是成员属性
而成员属性和成员变量的区别是什么呢?

类的成员变量:定义在方法外可以被类方法访问的是成员变量。
类的属性:类的成员变量中,外界可以通过setter方法和getter方法对成员变量进行操作,那么这个成员变量就是类的属性。

四、成员方法:成员方法是对象所具有的功能或操作,反应对象的行为,是具有某种相对独立功能的程序模块,很像C语言中的函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值