博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
OC语言基础知识
阅读量:5322 次
发布时间:2019-06-14

本文共 3079 字,大约阅读时间需要 10 分钟。

一、面向对象

OC语言是面向对象的,C语言是面向过程的,面向对象和面向过程只是解决问题的两种思考方式,面向过程关注的是解决问题涉及的步骤,面向对象关注的是设计能够实现解决问题所需功能的类。

术语:OO面向对象、OOP面向对象编程

 

二、类

(一)关于类

类的设计只关注三个东西:类名、属性和方法

注意:一般名词都是类,拥有相同属性和行为的对象都可以抽象为一个类,类名是标识符的一种,需要符合规范,通常类名的第一个字母大写,且不能有下划线,如果有多个单词则使用驼峰标识。在对方法进行类的划分中,一般采取的做法是谁最熟悉这个方法那么就把这个方法划分给谁。在OC中,对象对方法的调用称为消息机制,即向既定的对象发送了什么消息。

 

(二)简单内存分析

类创建对象,每个对象在内存中都占据一定的存储空间,每个对象都有一份属于自己的单独的成员变量,所有的对象公用类的成员方法,方法在整个内存中只有一份,类本身在内存中占据一份存储空间,类的方法存储于此。

每个对象内部都默认有一个isa指针指向这个对象所使用的类。

[p eat];表示给p所指向的对象发送一条eat消息,调用对象的eat方法,此时对象会顺着内部的isa指针找到存储于类中的方法,执行。

isa是对象中的隐藏指针,指向创建这个对象的类。

 

(三)类的声明和实现

1)类的声明:

这里声明了一个Person类,这个类拥有一个@public修饰的属性(成员变量),以及一个对象方法put。

1 #import 
2 3 @interface Person : NSObject 4 5 { 6 @public 7 int _age; 8 } 9 10 - (void)put;11 12 @end

 

2)类的实现:类的实现可以理解为类中的方法的实现 

1 #import "Person.h" 2  3 @implementation Person 4  5 - (void)put 6 { 7     NSLog(@"第一个程序!"); 8 } 9 10 @end

3)类的调用:在主函数首先创建了一个Person类型的对象(先调用alloc分配存储空间,后调用init方法初始化为0),并定义了一个Person类型的指针指向创建的这个对象,之后初始化对象成员变量_age的值为20,然后调用了对象的put方法,打印输出。

1 #import 
2 #import "Person.h" 3 4 int main(int argc, char * argv[]) { 5 6 Person *p = [[Person alloc] init]; 7 p -> _age = 20; 8 [p put]; 9 10 NSLog(@"看来纸上谈兵还是不行的");11 return 0;12 }

 

4)练习,创建一个Person类。

类的声明:

 

类的实现如下:

 

类的调用如下:

 

 

(四)常见错误

(1)@interface  @end和@implementation  @end不能嵌套包含

(2)只有类的声明没有类的实现

(3)漏写@end

(4)两个类的声明嵌套(可以把顺序打乱)

(5)成员变量没有写在{}里

(6)方法的声明写在了{}里面

(7)在声明时对类的成员变量进行初始化,请注意成员变量不能脱离对象而独立存在

(8)方法无法像函数那样的调用

(9)成员变量和方法不能用static等关键字修饰,不要和c语言混淆

(10)类的实现可以写在mian函数后面,在使用之前只要有声明就可以

 

三、OC对象与函数

OC对象与函数有着本质的区别:

(1)方法的实现只能写在@implementation··@end中,对象方法的声明只能写在@interface···@end中间

(2)对象方法都以-号开头,类方法都以+号开头

(3)对象方法只能由对象来调用,类方法只能由类来调用,不能当做函数一样调用

(4)函数属于整个文件,可以写在文件中的任何位置,包括@implementation··@end中,但写在@interface···@end会无法识别,函数的声明可以再main函数内部也可以在main函数外部。

(5)对象方法归类\对象所有

(6)函数调用不依赖与对象

(7)函数内部不能直接通过成员变量名访问对象的成员变量

 

四、类和方法的设计

工具类:基本没有任何的成员变量,里面的方法基本都是类方法。

注意:在对象方法中可以调用类方法。

需求:设计一个工具类:一个计算器类,要求(1)返回π,(2)计算两个整数的和,(3)计算某个整数的平方。

类的声明部分

 

1 // 计算器类的设计 2 // 方法1:返回π 3 // 方法2:计算两个整数的和 4 // 方法3:计算某个整数的平方 5  6 #import 
7 8 @interface JiSuanQi : NSObject 9 10 - (double)pi;11 - (int)sumWithNumber1:(int)num1 andNumber:(int)num2;12 - (int)pingFang:(int)number;13 14 @end

 

类的实现部分

 

1 // 计算器类方法的实现 2 #import "JiSuanQi.h" 3  4 @implementation JiSuanQi 5  6 // 三个对象方法的实现 7 - (double)pi 8 { 9     return 3.1415926;10 }11 12 - (int)sumWithNumber1:(int)num1 andNumber:(int)num213 {14     return num1 + num2;15 }16 17 - (int)pingFang:(int)number18 {19     return number * number;20 }21 22 @end

 

测试程序:

1 #import 
2 #import "JiSuanQi.h" 3 4 int main(int argc, char * argv[]) { 5 6 JiSuanQi *jisuanqi = [[JiSuanQi alloc] init]; 7 8 int pi; 9 pi = [jisuanqi pi];10 NSLog(@"%i", pi);11 12 int a = 10;13 int b = 11;14 int sum = [jisuanqi sumWithNumber1:a andNumber:b];15 NSLog(@"%i + %i = %i", a, b, sum);16 17 int c = 2;18 int pingFang = [jisuanqi pingFang:c];19 NSLog(@"%i 的平方等于 %i ", c, pingFang);20 return 0;21 }

 

转载于:https://www.cnblogs.com/zengshuilin/p/5732112.html

你可能感兴趣的文章
【FZSZ2017暑假提高组Day9】猜数游戏(number)
查看>>
泛型子类_属性类型_重写方法类型
查看>>
考研:操作系统:进程同步—信号量实现同步互斥(PV操作)
查看>>
增加、编辑、删除等功能,几乎每个系统都会用到,针对这几个方面,写如下测试用例...
查看>>
「学习笔记」数学大礼包
查看>>
Liunx笔记
查看>>
eclipse-将同一个文件分屏显示
查看>>
阿弥陀佛的原理
查看>>
Java学习笔记--类和对象
查看>>
case when
查看>>
设计模式之模板模式
查看>>
201521123111《Java程序设计》第12周学习总结
查看>>
【Luogu2444】病毒(AC自动机)
查看>>
【BZOJ2460】元素(贪心,线性基)
查看>>
【CF528E】Triangles 3000(计算几何)
查看>>
数据库语法01
查看>>
jq 获取表单所有数据
查看>>
javaweb项目中--jsp表单通过post提交-后台取不到数据但get方式可以
查看>>
web架构
查看>>
Mysql优化必备技能之Explain的使用以及Sql优化过程
查看>>