OC 知识复习 (一) 基础语法

20240201180620_image.png

(一) 基础语法

1. OC相对于C

a. 在C的击基础之上新增了1小部分面向对象的语法,
b. 将C的复杂的、繁琐的、可恶的语法封装的更为简单,
c. OC完全兼容C语言,
copy success

2. OC程序的源文件的后缀名是m, m 代表 message 代表OC中最重要的1个机制 消息机制

C程序的源文件的后缀名.C
copy success

3. main函数仍然是OC程序的入口和出口,

int类型的返回值代表程序的结束状态,
main函数的参数:  仍然可以接收用户在运行程序的时候传递数据给程序,参数也可以不要。
copy success

4.#import指令

1).以#号开头,是1个预处理指令,

2).作用: 是#inlcude指令的增强版。将文件的内容在预编译的时候拷贝写指令的地方。

3).增强: 同1个文件无论#import多少次,只会包含1次。
	 如果#include指令要实现这个效果 就必须要配合条件编译指令来实现
	 而#import指令只需要直接包含就可以 其他什么都不用作,
	 
4).简要原理:#import指令在包含文件的时候,底层会先判断这个文件是否被包含
   如果被包含就会略过 否则才会包含
copy success

5.框架

 1).是1个功能集 苹果或者第三方事先将一些程序在开发程序的时候经常要用到的功能事先写好,
   把这些功能封装在1个1个的类或者函数之中1)。这些函数和类的集合就叫做框架,
	有点像C语言的函数库,

 2).Foundation框架,
	Foundation:基础 基本。这个框架中提供了一些最基础的功能 输入和输出 一些数据类型

  Foundation.h的路径:
	/Applications/Xcode.app/contents/Developer/Platforms/
	Macosx.platform/Developer/SDKs/Macosx10.10,sdkSystem/
	Library/Frameworks/Foundation.framework/
	Versions/C/Headers/Foundation.h

	Foundation.h 这个文件中包含了Foundation框架中的其他的所有的头文件,
	所以,我们只要包含Foundation.h 就相当于包含了Foundation框架中所有的头文件,
	那么Foundation框架中的所有的函数和类就可以直接使用,
copy success

6.@autoreleasepool是自动释放池,

你只需要知道这个是1个自动释放池,
你可以将代码写在自动释放池之中 或者干脆把这个自动释放池删除 不会有任何影响,		
copy success

7.NSLog函数。

1).作用:是printf函数的增强版,向控制台输出信息,
2).语法:
		NSLog(@"格式控制字符串",变量列表);
		
		最简单的语法:
		NSLog(@"要输出的信息");

3).增强:
		a。输出一些调试相关信息
		
			2020-07-01 12:40:52.628 Day01-0C基础语法[784:210576] Hello,World!
			执行这段代码的时间,程序的名称,进程编号,线程编号,输出的信息,
		
		b,会自动换行,在输出完信息之后 会自动换行,
	  c,OC中其实新增了一些数据类型,
			 NSLog函数不仅仅可以输出C数据类型变量的值还可以输出0C新增的数据类型的变的值。
			 
	4).用法和printf函数差不多。一样可以输出变的值 并且占位符和用法都一样
	
 	5).使用注意:
		a. NSLog函数的第1个参数前面必须要加1个@符号,
		b. 如果手贱在字符串的末尾加了1个'\n'代表换行 那么函数的自动换行功能就会失效,	
copy success

8.字符串

1).C语言的字符串的存储方式
		a.使用字符数组存储
		b.使用字符指针
		
2).OC中设计了1个更为好用的用来存储字符串的1个类型。 NSString
	 NSString 类型的指针变量 专门用来存储OC字符串的地址.		
	 
3).OC的字符串常量必须要使用1个前缀@符号:
	"jack”这是1个C语言的字符串,@"jack”这是1个OC的字符串常量,
	NSString类型的指针变量,只能存储OC字符串的地址,
	
4).总结
	a. 在OC中专门设计了1个NSString类型来存储字符串,
	b.字符串分为C字符串和OC字符串,
	   字符串如果没有@前缀 那么这个字符串常量就是1个C字符串,
	   字符串如果有@前缀那么这个字符串常量就是0C字符串,
  	 所以,OC字符串常量的前面必须要加1个@符号.
	
	c. NSString类型的指针变量 只能存储OC字符串.
		 NSString *str = @"jack"	   
		 
5),注意
	1).NSLog函数的第1个参数是1个OC字符串,所以NSLog函数的第1个实参应该以@符号开头。   
copy success

9.NS前缀.

NextStep --->Cocoa---> Foundation框架之中.
copy success

10.@符号

1)。将C字符串转换为0C字符串,
		"jack"@" jack"
		
2),0C中的绝大部分的关键字都是以@符号开头 
    @autoreleasepool
copy success

11.注释:

和C语言的注释一模一样,分为单行注释和多行注释,
copy success

12,函数的定义和调用。

与C语言的函数的定义和调用是一样的
copy success

(二) OC与C的对比

  1. OC程序的编译、连接、执行,

     1).在.m文件中写上符合0C语法规范的源代码,
     2).使用编译器将源代码编译为目标文件,
    
     		cc -c demo.m
     
     		a.预处理
     		b.检查语法
     		c.编译
     
     3).链接
      	cc demo.o
     
     如果程序中使用到了框架中的函数或者类,那么在链接的时候,
     就必须要告诉编译器去那1个框架中找这个函数或者类,
     
     	cc demo.o -framework Foundation
     
     4). 链接成功以后 就会生成 1 个 demo.out 可执行文件 执行就可以了。
    
    copy success
#import <Foundation/Foundation.h>
int main() {
	NSLog(@"Hello,World");
	return 0;
}
copy success
1
2
3
4
5

2、我们1点击运行按钮 所有的事情Xcode就帮助我们自动的做了,

  1. OC程序和C程序各个阶段后缀名对比
- 源文件 目标文件 可执行文件
C .c .o .out
OC .m .o .out

  1. OC中的数据类型,

     1). OC中支持C语言中的所有的数据类型,
     
     	a.基本数据类型 
     	  int double float char
     		
     	b.构造类型
     		数组 结构体 枚举
     	
     	c.指针类型
     		int *p1;
     	
     	d.空类型
     		void
     		
      e.typedef自定义类型,
    
    copy success

    2). BOOL类型。

     1).可以存储YES或者NO中的任意1个数据,
     
     2)一般情况下B00L类型的变量用来存储条件表达式的结果,
     如果条件表达式成立 那么结果就是YES如果条件表达式不成立 结果过就是N0
    
     3).BOOL的本质
     
     typedef signed char BOOL;
     实际上B00L类型的变量 是1个有符号的char变量
     
     #define YES((B00L)1)
     #define NO((BO0L)0)
    
    copy success

    3). Boolean

      a.Boolean类型的变量可以存储true或者flase
      
      b.一般情况下Boolean类型的变量用来存储条件表达式的结果,
      如果条件表达式成立 那么结果就是true如果条件表达式不成立 结果过就是false
      
      c.本质
      
      typedef unsigned char Boolean;
      
      #define true 1
      #define false 0
    
    copy success

4). class 类型。类 5). id类型 万能指针 6). nil 与NULL差不多 7). SEL 方法选择器 8). block 代码段


  1. OC支持C语言中的所有的运算符
  • 赋值运算符 ≡
  • 算术运算符 + - * / %
  • 复合赋值运算符: += -= *= /= %=
  • 自增与自减 ++ --
  • 关系运算符 > >= < <= == !=
  • 逻辑运算符 && !
  • 取地址运算符:&
  • 指针访问运算符 *
  • 位运算符 & | ^ ~
  • ...

  1. OC支持C的所有的控制语句
  • IF结构
  • switch-case结构
  • while
  • do-while
  • for
  • 数组
  • 指针
  • 函数
  • ...

  1. OC支持C语言中的全部的关键字,并且效果一致, OC也新增了一些关键字.OC新增的关键字绝大多数都是以@符号开头
  • @interface
  • @implmentation
  • @public
  • ...

总结: OC语言完全兼容C语言在oc中可以写任意的C代码并且效果一致

(三) 面向过程与面向对象

(四) 类与对象

  1. 如何定义类

     1).类的三要素。
         (类名 特征 行为) 
     		(构造器 属性 方法)
     
     2).定义类的语法
     	a. 位置,直接写在源文件之中 不要写在main函数之中。
     	b。类的定义分为两个部分。
     
     		-> 类的声明
     		inteface 类名 : NSobject 
     		{
        		这类事物具有的共同的特征,将他们定义为变量。
     		}
     		功能就是1个方法,将方法的声明写在这里,
     		@end
     		
     	-> 类的实现
     	@implementation 类名
     		将方法的实现写在这里。
     	@end
     	
     3),几点注意
     	a,类必须要有声明和实现
     	
     	b.类名用你描述的事物的名称来命名就可以了,
     		类名的每1个单词的首字母必须要以大写开头
     		
     	c.NSObject是神马意思 不用管:照写就可以了
     	
     	d.用来表示着类事物的共同的特征的变量必须要定义在@interface的大括弧之中
     	
     	e.定义在大括弧之中用来表示着类事物的共同的特征的变量我们叫做
     		属性 成员变量 实例变量 字段.....
     		
     	f.为类定义属性的时候,属性的名称必须要以”_”下划线开头
     	
       语法是固定的。
     	
        @interface 类名 : NSObject
     	 {
     			这类事物具有的共同的特征定义为变量,
     			数据类型 变量名1;
     			数据类型 变量名2;
     			...
     	 }
     	 @end
     	 
     	@implementation 类名
     	@end
    
    copy success

6.如何使用对象;

如何访问对象的属性:
1)。默认情况下,对象的属性是不允许被外界直接访问的
	如果允许对象的属性可以被外界访问,那么就再声明属性的前加1个@public关键字
	
2).访问对象的属性的方式
	 对象名->属性名
	 
3.无参数的方法,
	1).声明
	
		a.位置: 在@interface的大括弧的外面,
		
	  b,语法:
		- (返回值类型)方法名称;
		- (void)run;
		表示声明了1个无返回值并且无参数的方法方法名字叫做run

  2).实现
	  a.位置:在@implementation之中实现
		b.实现的语法:
			将方法的声明拷贝到@implementation之中,
			去掉分号 追加大括弧1对 将方法实现的代码写在大括弧之中。
			
	3).调用
	 a.方法是无法直接调用的,因为类是不能直接使用的,必须要先创建对象,
	 那么这个对象中就有类中的属性和方法了 就可以调用对象的方法了,
	 
	 b.调用对象的方法,
		 [对象名 方法名];
		 
4.带1个参数的方法
	1).声明
	 a.位置: 在@interface的大括弧的外面,
	 b.语法:
		- (返回值类型)方法名称:(参数类型)形参名称;
	  - (void)eat:(NSString *)foodName;
	  
		定义了1个方法 这个方法没有返回值,
		这个方法的名字叫做'eat:'
		这个方法有1个参数,类型是NSString *类型的 参数的名字叫做foodName
		
	2).实现
	  a.位置:在@implementation之中实现
		b.实现的语法:
			将方法的声明拷贝到@implementation之中,
			去掉分号 追加大括弧1对 将方法实现的代码写在大括弧之中。
	
	3).调用
	 a.方法是无法直接调用的,因为类是不能直接使用的,必须要先创建对象,
	 那么这个对象中就有类中的属性和方法了 就可以调用对象的方法了,
	 
	 b.调用对象的方法,
		 [对象名 方法名:实参];
		 
5.带多个参数的方法
 1)声明
		a.位置: 在@interface的大括弧的外面,
		b,语法:
		-(返回值类型)方法名称:(参数类型)形参名称1 :(参数类型)参数名称2 :(参数类型)参数名称3;
	  -(int)sum:(int)num1 :(int)num2;
		表示声明了1个方法 这个方法的返回值类型是int类型的
		方法的名称叫做'sum: :'
		有两个参数 参数类型都是int类型 参数名称叫做num1 num2
 
 	2).实现
	  a.位置:在@implementation之中实现
		b.实现的语法:
			将方法的声明拷贝到@implementation之中,
			去掉分号 追加大括弧1对 将方法实现的代码写在大括弧之中。
	
	3).调用
	 a.方法是无法直接调用的,因为类是不能直接使用的,必须要先创建对象,
	 那么这个对象中就有类中的属性和方法了 就可以调用对象的方法了,
	 
	 b.调用对象的方法,
		 [对象名 方法名:实参1 :实参2];
 
6,带参数的方法声明的规范:
	 1). 如果方法只有1个参数,要求最好这个方法的名字叫做xxxWith:
	 xxxWithxxx
	 eatWith:
	 eatWithFood:
	 这样写的话,那么调用方法的时候看起来就像是1条完整的语句。提高了我们代码的阅读性
	 遵守的规范: 就是让我们的方法调用的时候看起来像1条完整的语句.
	 
  2),如果方法有多个参数 建议这个方法名称!
	方法名With:(参数类型)参数名称 and:(参数类型)参数名称 and:(参数类型)参数名称;
	- (int)sumWith:(int)num1 and:(int)num2;
	
		sumWith: and:
	
	 更详细的写法
	 方法名With参数1:(参数类型)参数名称 and参数2:(参数类型)参数名称 and参数3:(参数类型)参数名称;
copy success