都是注释哈
类的组成:
C语言中函数分为声明和实现
OC中定义一个类也分为声明和实现, 也就是说以后我们在OC中定义类, 就是在写类的声明和实现
编写类的声明和实现:
声明 .h:
/* 行为方法: OC中的行为和C语言中的函数一样, 都是用来保存一段特定功能的代码 C语言中定义一个函数, 分为声明和实现, 声明写在.h中, 实现写在.c中 OC中定义一个方法, 也分为声明和实现, 声明写在@interface中, 实现写在@implementation C语言的函数分为两种: 内部函数和外部函数 OC中的方法也分为两种; 类方法和对象方法 类方法只能用类名调用, 对象方法只能用对象调用 OC中的类方法用+表示, OC中的对象方法用-表示 编写C语言函数的规律: 1.确定函数名称 2.确定形参 3.确定返回值 4.确定返回值类型 编写OC方法也有规律, 规律和C语言一模一样 OC中的方法, 如果没有形参不需要写(), 而是直接写一个; 因为OC方法中的()有特殊的用途, OC方法中的()是用来扩住数据类型的 OC中的方法如果有参数, 那么每个参数的数据类型前面必须加上一个: 冒号 : 也是方法名的一部分 所以 方法名 test 与 test: 是不同的 为了提高我们的阅读性, OC方法允许我们给每个参数添加一个标签来说明当前参数的含义 标签也是方法名的一部分 - (int)sendMessageWithNumber:(int)number andContent:(char *)content; 方法名为: sendMessageWithNumber:andContent: 这方法名就他妈一句子 方法声明了必须要实现 如果声明的是对象方法那么就必须实现对象方法 如果声明的是类方法那么就必须实现类方法 如果你不想每次使用方法都需要创建对象开辟存储空间 并且如果该方法中没有使用到属性(成员变量), 那么可以把这个方法定义为类方法 类方法的实现 声明部分 除了把 - 改为 + 其他都与对象方法一样 类方法和对象方法的区别 0. 对象方法以-开头 类方法以+开头 1. 对象方法必须用对象调用 类方法必须用类来调用 2. 对象方法中可以直接访问属性(成员变量) 类方法中不可以直接访问属性(成员变量) 3. 类方法和对象方法可以进行相互调用 3.1对象方法中可以直接调用类方法 3.2类方法中间接调用对象方法 (注意: 不建议这样使用) (在类方法中创建对象或将对象作为参数) 3.3类方法中可以直接调用其它类方法 3.4对象方法中可以直接调用对象方法 类方法的应用场景 类方法一般用于定义工具方法 如果方法中没有使用到属性(成员变量), 那么能用类方法就用类方法 类方法的执行效率比对象方法高 函数和方法的区别 1.函数属于整个文件, 方法属于某一个类 方法如果离开类就不行 2.函数可以直接调用, 方法必须用对象或者类来调用 注意: 虽然函数属于整个文件, 但是如果把函数写在类的声明中会不识别 3.不能把函数当做方法来调用, 也不能把方法当做函数来调用 方法的注意点: >方法可以没有声明只有实现 >方法可以只有声明没有实现, 编译不会报错, 但是运行会报错 如果方法只有声明没有实现, 那么运行时会报: reason: '+[Person demo]: unrecognized selector sent to class 0x100001140' 发送了一个不能识别的消息, 在Person类中没有+开头的demo方法 reason: '-[Person test]: unrecognized selector sent to instance 0x100400000' */ #import <Foundation/Foundation.h> /* 以@interface开头 , 以@end结尾, 然后再class name对应的地方写上类名即可 注意: 类名的首字符必须大写 声明一个类的目的就是为了告诉系统, 我们这个类中有哪些属性和行为 */ //定义一个会员类 类名后面的 :NSObject 是为了让我们的类具备创建对象的能力 @interface Member : NSObject //OC类声明中属性只能在写@interface和@end之间的{}中 { //成员变量的声明 编写OC类属性的时, 建议将所有属性的名称前面都加上_ //默认情况下, OC对象中的属性是不能直接访问的 只要让类中的属性公开, 以后就可以直接通过一个指向结构体的指针来操作对象中的属性 @public //会员账号 NSString* _account; //会员密码 NSString* _password; //余额 double _money; //积分 int _point; } //实例方法的声明 //查看自己信息 无参无返回值 - (void) checkInfo; //修改密码 有参无返回值 - (void) changePwdWithNewPwd:(NSString*) newPwd; //充值 返回新余额 有参有返回值 - (double) rechargeMoney: (double) money; //登陆 有参有返回值 - (bool) loginWithAccount: (NSString*) account andPwd: (NSString*) pwd; //获得积分数量 无参有返回值 - (int) getPoint; //类方法的声明 //无参无返回值 + (void) staticMethod0; //有参无返回值 + (void) staticMethod1WithArg:(int) arg; //无参有返回值 + (NSString*) staticMehtod2; //有参有返回值 + (int) staticMethod3WithArg1: (int) arg andArg2: (NSString*) arg2; @end
实现 .m:
/* 常见错误: 1.只有类的声明,没有类的实现 2.漏了@end 3. @interface和@implementation嵌套 4.成员变量没有写在括号里面 5.方法的声明写在了大括号里面 6.成员变量不能在{}中进行初始化、不能被直接拿出去访问 7.方法不能当做函数一样调用 8.OC方法只能声明在@interface和@end之间,只能实现在@implementation和@end之间。也就是说OC方法不能独立于类存在 9.C函数不属于类,跟类没有联系,C函数只归定义函数的文件所有 10.C函数不能访问OC对象的成员 11.低级错误:方法有声明,但是实现的时候写成了函数 12.OC可以没有@interface同样可以定义一个类 */ #import "Member.h" // 类的实现 以@implementation开头, 以@end结尾, 然后在class对应的地方写上声明的类的名称, 必须和声明的类名一模一样 @implementation Member //方法的实现 - (void) checkInfo{ NSLog(@"调用实例方法显示会员信息:"); NSLog(@"账号:%@ 密码:%@ 余额:%.2lf 积分:%i", _account, _password, _money, _point); return; } - (void) changePwdWithNewPwd:(NSString *)newPwd{ NSLog(@"原密码:%@", self->_password); self->_password = newPwd; NSLog(@"新密码:%@", self->_password); return; } - (double) rechargeMoney:(double)money{ NSLog(@"充值前余额:%.2lf", _money); _money += money; return _money; } - (bool) loginWithAccount:(NSString *)account andPwd:(NSString *)pwd{ //如果在对象方法中想访问该对象的属性, 可以直接写上_属性名称即可 if (account == _account && pwd == _password) { return YES; } else{ return NO; } } - (int) getPoint{ return _point; } //类方法的实现 + (void) staticMethod0{ NSLog(@"偶是类方法 无参无返回值"); } + (void) staticMethod1WithArg:(int)arg{ NSLog(@"偶是类方法 有参无返回值"); } + (NSString*) staticMehtod2{ NSLog(@"偶是类方法 无参有返回值"); return @" "; } + (int) staticMethod3WithArg1:(int)arg andArg2:(NSString *)arg2{ NSLog(@"偶是类方法 有参有返回值"); return 0; } @end
主文件main:
#import <Foundation/Foundation.h> #import "Member.h" int main(int argc, const char * argv[]) { /* 创建对象: 在OC中想要通过一个类来创建一个对象, 必须给类发送一个消息(好比C语言中调用函数一样) 如何发送消息? 在OC中只要想要发送消息就先写上 [类名称/对象名称 方法名称]; 发送什么消息(调用什么方法)可以创建一个对象呢? new 只要通过一个类调用类的new方法, 也就是给类发送一个叫做new的消息之后 系统内部就会做3件事情 1. 为Iphone类创建出来得对象分配存储空间 2. 初始化Iphone类创建出来的对象中的属性 3. 返回Iphone类创建出来的对象对应的地址 创建对象的时候返回的地址其实就是类的第0个属性的地址 一个叫做isa的属性 isa是一个指针, 占8个字节 其实类也是一个对象, 也就意味着Person也是一个对象 平时我们所说的创建对象其实就是通过一个 类对象 来创建一个 新的对象 类对象是系统自动帮我们创建的, 里面保存了当前对象的所有方法 而实例对象是程序自己手动通过new来创建的, 而实例对象中有一个isa指针就指向了创建它的那个类对象 */ //通过一个Member类型的指针接收了 新创建的Member对象的地址 称为Member类型的指针mem为Member对象 //每次给Iphone类发送一个new消息都会开辟一块新的存储空间 也就意味着每次发送new消息创建出来的对象都是一个新的对象 如果修改A的属性不会影响到B的属性 Member * mem = [Member new]; //Member * mem = [[Member alloc] init]; //访问对象的成员变量 mem->_account = @"test"; mem->_password = @"123"; mem->_money = 50; mem->_point = 10; //实例方法的调用(发送消息) [对象名 方法名]; [mem checkInfo]; //[对象名 方法名: 参数]; [mem changePwdWithNewPwd:@"321"]; double money = [mem rechargeMoney:20]; NSLog(@"充值后余额:%.2lf", money); bool login = [mem loginWithAccount:@"text" andPwd:@"123"]; if (login) { NSLog(@"会员登陆成功"); } else{ NSLog(@"会员账户或密码输入错误 请重新登陆"); } int point = [mem getPoint]; NSLog(@"会员积分: %i", point); //类方法的调用 [类名 方法名] [Member staticMethod0]; [Member staticMethod1WithArg:11]; NSString* str = [Member staticMehtod2]; int i = [Member staticMethod3WithArg1:21 andArg2:@"呵呵"]; return 0; } /* 2015-08-26 22:37:06.899 OC类[628:30449] 调用实例方法显示会员信息: 2015-08-26 22:37:06.901 OC类[628:30449] 账号:test 密码:123 余额:50.00 积分:10 2015-08-26 22:37:06.901 OC类[628:30449] 原密码:123 2015-08-26 22:37:06.901 OC类[628:30449] 新密码:321 2015-08-26 22:37:06.901 OC类[628:30449] 充值前余额:50.00 2015-08-26 22:37:06.902 OC类[628:30449] 充值后余额:20.00 2015-08-26 22:37:06.902 OC类[628:30449] 会员账户或密码输入错误 请重新登陆 2015-08-26 22:58:20.454 OC类[674:36997] 会员积分: 10 2015-08-26 22:48:31.914 OC类[657:33820] 偶是类方法 无参无返回值 2015-08-26 22:48:31.914 OC类[657:33820] 偶是类方法 有参无返回值 2015-08-26 22:48:31.915 OC类[657:33820] 偶是类方法 无参有返回值 2015-08-26 22:48:31.915 OC类[657:33820] 偶是类方法 有参有返回值 */