OOP面向对象编程 Object-Oriented Programming
什么是对象?对象是对客观事物的抽象和封装(特征数据+行为方法)
什么是类?类是对对象的抽象,是一种抽象的数据类型。
对象是类的实例,类是对象的模版。
一、function 函数
void drawShapes(id shapes[], int count){
for(int i=0 ; i<count ; i++){
id shape = shapes[i];
[shape draw];
}
}//drawShapes
- 不在类里面,不能声明方法,只能声明C语言里的函数。
- oc中[ ]意义:用于通知某个对象该去做什么(消息机制)
第一项是对象,其余部分是需要对象执行的操作(即发送消息/调用方法)。
具体过程:对象是消息的目标,先查出它属于哪一个类,再找到相应函数执行。
二、 interface接口 -> 类的声明
- 接口是类为对象提供的特性描述。
-
基本数据类型
NSInteger整型
NSUInteger无符号整数
NSString字符串
NSString* 指针类型 赋值str=@“123”
CGFloat 小数 来自CoreGraphics框架 - 类声明写法:
@interface Person:NSObject{ //@interface标志,NSObject表示类的继承
NSInteger _age; //数据成员,实例变量
NSString* _name;
}
//声明类的功能,类给外部提供的功能,不表示是类的全部功能。对业务逻辑进行保护
-(void) setName: (NSString*) name; //-方法声明 (void)方法返回类型 参数
-(NSString*) name;
@end //Person
- OC方法可以返回与C函数相同的类型:标准类型(整型、浮点型和字符串)、指针、引用对象和结构体。
-
中缀符语法技术
【类声明语法】 + / - (返回类型) 名字1:(类型1)参数1 名字2:(类型2)参数2 …..- +类型方法 [类名 类型方法]
- -实例方法 [对象 实例方法]
-(void)setInitX:(int)n andSetInitY:(int)d;
- 例子中在第二个参数前面设置一个中缀符(andSetInitY),中缀符也是函数名的一部分。
-
中缀符解决了方法调用时的代码可读性问题:
【调用】[test setInitX:1 andSetInitY:2]; - 若在Java中则会写成public void setInit(int n, int d);
Java和OC二种语法比较起来就好像是数学中的分配率:a(b+c) = ab+ac - 最后用表格来对比一下C和OC
比较项目 | C | OC |
---|---|---|
无参数 | int foo(); | -(int)foo; |
int ret= obj->foo(); | int ret = [obj foo]; | |
一个参数 | int foo(int a); | -(int)foo:(int)a; |
int ret = obj->foo(100); | int ret = [obj foo:100]; | |
两个参数 | int foo(int a,int b); | -(int) foo:(int)a :(int)b; |
int ret = obj->foo(10,20); | int ret = [obj foo:10 :20]; | |
带标签 | int fooAndB(int a, int b); | -(int)foo:(int)a andB:(int)b; |
int ret = obj->fooAndB(10,2); | int ret = [obj foo:10 andB:2]; |
三、implementation -> 类的实现
- 实现是使接口能正常工作的代码
@implementation Person
-(void) setName: (NSString*) name {
//参数要重新命名,不能与成员变量同名,否则会覆盖初始变量
_name=name;
}
-(NSString*)name{
return _name;
}
四、对象的创建
- 分配内存+初始化 (具体在下一篇
构造方法中展开介绍)
OC的对象都是动态分配在堆中,只能通过指针访问 - 消息机制 【接受者 消息 (方法)】
【对象 对象方法】;
【类名 类型方法】;
int main(int argc, const char *argv[])
{
Shape* shape1 = [Shape new ]; //自动调用的方法
Shape* shape2 = [ [Shape alloc] init ]; //与上一行等价,但二者指向不同地址
return (0);
}
- 对象创建使用结束后需要释放内存
- ARC (Automatic Reference Counting) 自动引用计数,释放没有指针再指向的内存块
- MRC (Mannul Reference Counting) 手动管理,向对象发送release消息 [shape release];
五、getter/setter方法
@interface Person : NSObject{
NSString* _name;
NSInteger _age;
}
//声明类的功能,类给外部提供的功能
-(void)setName:(NSString*)name; //setter方法声明
-(NSString*)name; //getter方法声明
@end
@implementation Person
-(void)setName:(NSString *)name{ // setter方法实现,将参数name的值赋给成员变量_name
_name=name;
}
-(NSString*)name{ // getter方法的实现,获取当前对象成员变量_name的值
return _name;
}
@end