一、OC概述
1.简介
OC是基于C,所以在代码上是完全兼容C的。在OC中,你可以使用C的语法,甚至C++的语法。
C是面向过程的语言,而OC是面向对象的语言。
2.关键字
OC中的关键字都以“@”开头。
如:@public、@string
二、面向对象
1.面向对象和面向过程
是考虑事情的2种不同思想。面向过程,考虑的是做事情需要哪些步骤,面向对象考虑的则是谁能做这些事。
就比如:我想打电话
面向过程:开机->找到通讯录->拨打号码
面向对象:找手机
C是面向过程的语言,OC是面型对象的语言,其实OC的核心本质还是面向过程的语言,只是苹果给OC披了一层面向对象的外套。
2.OC中的面向对象
1)要想创建一个类的对象,必须先有该类的声明。在类的声明中,可以声明类的属性和方法。
2)然后,进行类的实现,主要就是对类中的方法进行实现。
3)创建类的对象,并赋值。需要用指针,在OC中,操作对象一定且只能用指针。
3.OC中的"[]"和”()“
1)在OC中,行为要使用”[]“。
如:创建对象:Person *p =[Person new];
调用方法:[p walk];
2)在OC中,”()“只能用于括住数据类型,不能乱用,更不能作为方法的后缀。
4.实例
#import <Foundation/Foundation.h> @interface Person : NSObject { @public double weight; int age; } - (void)walk; @end @implementation Person - (void)walk { NSLog(@"某人有%d岁,体重为%fkg,有走路的方法!",age,weight); } @end int main() { Person *p1 = [Person new]; p1->weight=89.2; p1->age=30; NSLog(@"年龄为%d,体重为%f",p1->age,p1->weight); [p1 walk];//指针对象向Person对象发送消息,调用方法,那么对象的属性也可以直接用 Person *p2 =[Person new]; p2->weight=90.2; p2->age =40; p1=p2; p1->age=50; [p2 walk]; return 0; }解析:
1)类的声明
使用”@interface ...@end“,且必须继承NSObject,由于该类位于Foundation框架中,所以必须导入该框架。
2)属性声明
使用"{}",可以使用@public关键字,在该关键字之后的属性都是共有的。
3)方法声明
必须严格遵守格式:
如:- (void)run;
如:- (void)eat;
4)类的实现
使用"@implementation...@end"。
5)方法的实现
要想使用声明的方法,必须实现该方法。格式:
如:- (void)run{...}
6)创建对象和赋值
Person *p = [Person new];//新建一个指针对象,指向新建的Person对象
p->weight=120.8;//创建指针对象就是为了操作该对象,并赋值。
p->age=30;
7)调用类的方法
[p run];
三、类
1.类
类是抽象的,是对具有相同特征的事物的抽象描述。
对象是具体的,是类的实例。
2.类的设计
类的设计只需关心三点:
1)事物名称:类名
2)属性
3)行为
3.类的声明和实现
在OC中,虽然可以将类的声明和实现合并到一起,但是不建议这么做。推荐将类的声明和类的实现分开写,先有类的声明,再有类的实现。
在OC中,对类的任何操作都需要用到指针,而且只能使用指针。
声明:@interface ...@end
实现:@implementation...@end
4.类的属性和方法
1)如果想要类的属性(成员变量),能够被外界对象随意访问,可以将成员变量设置为@public。在@public之后的所有成员变量的权限都是public。
@public int wheel; int speed;2)OC中的方法和C中的函数是2个不同的概念,在OC中,只说方法。在OC中的“()”只能用来括住数据类型,参数列表不能使用括号。
- (void)run:(int)age
5.注意
在类的声明中,只能有成员变量的声明,不能赋值或者声明为静态的。
在@interface...@end之间不能嵌套其它的@xx...@end
对实现的方法,也不能使用static修饰,只有函数才有这种用法。
类的声明必须放在该类的对象创建之前,类的实现可以放在后面,因为编译是从前向后执行的。
6.函数和方法的区别
1)方法
1->对象方法都已“-”开头
2->对象方法的声明必须放在@interface...@end之间
对象方法的实现必须放在@implementation...@end之间。
3->对象方法必须由对象进行调用,函数则不需要。
2)函数
1—>函数能写在文件中的任意位置,函数归文件所有。
2->函数调用不依赖于对象
3->函数有参数列表,有“()”
7.类的合理设计
//如果结果只有固定的取值,使用枚举 typedef enum{ SexMan,//取值一般以枚举类型开头,前面也可以加"k"表示常量 SexWomen } Sex; //Sex为枚举类型 typedef struct{ //创建结构体 int year; int month; int day; } Date; typedef enum{ //创建枚举类型 ColorBlack, //第0个元素 ColorRed, ColorGreen } Color; #import <Foundation/Foundation.h> @interface Student : NSObject { @public Sex sex;//性别 Date birthday;//生日 double weight;//体重 Color favColor;//喜欢的颜色 char *name;//姓名 } - (void)eat; - (void)run; - (void)print; @end @implementation Student - (void)eat { weight +=1; NSLog(@"吃完这次后体重是%f",weight); } - (void)run { weight -=1; NSLog(@"跑完体重是%f",weight); } - (void)print { NSLog(@"性别=%d,喜欢的颜色=%d,姓名=%s,生日=%d-%d-%d",sex,favColor,name,birthday.year,birthday.month,birthday.day); } @end int main() { Student *s1=[Student new]; s1->weight=50; s1->sex=SexMan; s1->name="jack"; Date d = {1988,10,22};//创建结构体 s1->birthday=d;//birthday的数据类型为结构体 s1->favColor=ColorBlack; [s1 eat]; [s1 eat]; [s1 run]; [s1 run]; [s1 print]; return 0; }