Oc中的关键字都以@开头,
#import <Foundation/Foundation.h> //判断前面有没有包含该文件,如果包含,就不会包含,而在C语言中用#include,每次都会使用#ifndef判断是否存在。
OC中的类
.h文件就是类的声明文件,用于声明变量、方法,很像Java中的接口声明
.m文件是类的实现文件,用于实现.h中的方法
oc中方法的定义和Java看起来很不一样,刚开始看还不是很习惯,(类型)方法名:(类型)参数名称 ,如果有多个参数,一个冒号对应一个参数
Person的.h文件
#import <Foundation/Foundation.h>
//必须指定继承 @interface Person : NSObject{ //成员变量定义在括号内 int age; int no; }
//age的get方法 //-动态方法对象方法 //+静态方法类方法 //- (int)getAge; - (int)age; -(void)setAge:(int)newAge; //方法名setAge: -(void)setAge; //方法名setAge; -(int)no; //多参数方法一个冒号一个参数 -(void)setAge:(int)newAge andNo:(int)newNo; -(void)setParam:(int)newAge andNo:(int)newNo andHeight:(int)height; //方法名是setParam:andNo:andHeight: |
@end
由以上可以看出冒号也是方法的一部分Person的.m文件
#import "Person.h"
@implementation Person
//-(int)getAge{ // return age; //}
//get方法 -(int)age{ return age; } -(int)no{ return no; }
-(void)setAge:(int)newAge{ age=newAge; }
-(void) setAge:(int)newAge andNo:(int)newNo{ age=newAge; no=newNo; }
@end |
测试方法
#import <Foundation/Foundation.h> #import "Person.h"
int main(int argc,constchar * argv[]) {
@autoreleasepool {
//alloc init release方法都属于父类NSobject的方法 //静态方法alloc分配内存动态方法init初始化 Person *p=[[Personalloc]init];
//向指针变量P指向的对象发送一条init消息 //p=[p init];
//[p setAge:20]; [p setAge:10andNo:20]; //int age=[p getAge]; NSLog(@"person的年龄=%i",[p age]); //释放对象 [p release];
} return 0; } |
在内存中的关系
oc中的点语法,我们先对上面的方法升级一个版本
#import <Foundation/Foundation.h> @interface Person : NSObject{ int _age; //如果不加下划线,我们在使用.语法的时候很容易混淆,以为是访问了成员变量,所以我们加一个下划线区分 int _no; } - (int)age; -(void)setAge:(int)age; |
#import "Person.h" @implementation Person //get方法 -(int)age{ return _age; } -(int)no{ return _no; } -(void)setAge:(int)age{ _age=age; //self.age=newAge;// [self setAge:newAge];会造成死循环 无限调用 } |
//[p setAge:20]; p.age=25; //调用set方法而不是访问成员变量 编译器会变成[p setAge:25] int age=p.age;//调用get方法 ==[p age]; |