------- android培训、java培训、期待与您交流! ----------
1、对象与方法的关系
对象也可以像变量、数组和指针一样,作为方法的实参或返回值,用于在相关数据进行操作处理。
1.1 对象作为方法的参数
创建Person类,实现功能:对象作为方法的参数,显示参数Person类的姓名、性别。
对象作为方法的参数示例代码:
#import <Foundation/Foundation.h> typedef enum{kSexman,kSexwoman} Sex;//定义Sex枚举类型 //定义Person类 #pragma mark Person类 @interface Person : NSObject { @public NSString *_name; Sex _sex; } - (void)disPerson:(Person *) p; @end //Person类的实现 @implementation Person - (void)disPerson:(Person *) p { NSLog(@"姓名: %@,性别:%d ",p->_name,p->_sex); } @end int main(int argc,const char * argc[]){ @autoreleasepool{ //创建p与p1对象 Person *p = [Person new]; Person *p1 = [Person new]; //初始化p1 p1->_name = @"张三"; p1->_sex = kSexman; [p disPerson p1];//对象方法调用 } return 0; }
1.2 对象作为方法的返回值
创建Person类,实现功能:对象作为方法的返回值,修改返回值Person类为参数Person类的姓名。
对象作为方法的返回值示例代码:
#import <Foundation/Foundation.h> typedef enum{kSexman,kSexwoman} Sex;//定义Sex枚举类型 //定义Person类 #pragma mark Person类 @interface Person : NSObject { @public NSString *_name; Sex _sex; } - (Person *)ChangeName:(Person *) p; @end //Person类的实现 @implementation Person - (Person *)ChangeName:(Person *) p { Person *person = [Person new]; person->_name = p->_name; return person; } @end int main(int argc,const char * argc[]){ @autoreleasepool{ //创建p与p1对象 Person *p = [Person new]; Person *p1 = [Person new]; //初始化p1 p1->_name = @"张三"; p1->_sex = kSexman; [p ChangeName p1];//对象方法调用 NSLog(@"p 的姓名为: %@",p->_name); } return 0; }
1.3 对象作为方法的参数连续传递
创建Gun、Person类,实现功能:人开枪,枪发射子弹。
对象作为方法的参数连续传递代码示例:
#import <Foundation/Foundation.h> typedef enum{kSexman,kSexwoman} Sex;//定义Sex枚举类型 //定义Person类 #pragma mark Person类 @interface Person : NSObject { @public NSString *_name;//姓名 int _life;//血量 } + (void)Run;//奔跑 - (void)Shoot:(Gun *) gun;//射击 @end //Person类的实现 @implementation Person + (void)Run//奔跑 { NSLog(@"可劲跑呢"); } - (void)Shoot:(Gun *) gun//射击 { [gun Fire]; } @end //定义Gun类 #pragma mark 枪类Gun @interface Gun : NSObject { @public NSString *_size;//型号 int _bullet;//子弹数 } - (void)Fire;//射击 @end//Gun类的实现@implementation Gun - (void)Fire//射击 { NSLog(@"突突突……,剩余子弹%d",gun->_bullet); } @end int main(int argc,const char * argc[]){ @autoreleasepool{ //创建p与p1对象 Person *p = [Person new]; Gun *gun = [Gun new]; //初始化p p->_name = @"张三"; p->_life = 100; //初始化gun gun->bullet = 10; gun->size = @"国产87式5.8MM步枪弹"; [p Shoot gun];//对象方法调用 } return 0; }
2、类方法的使用
使用类方法可以
(1) 由于使用类方法不需要创建对象,不用分配内存堆空间,可以减少内存空间的分配。
(2) 减少内存访问与查找时间,提高代码执行效率。
(3) 作为工具方法,例如统计字符串的长度等。
3、函数与对象方法的区别
函数的定义,如:void run();
函数的实现,如:void run(){ //函数具体功能实现代码 }
函数的使用说明:
(1) 函数执行是平行的,没有使用优先级。
(2) 函数没有隶属关系,而对象方法的使用遵循类的隶属关系。
(3) 函数不可以使用类的成员变量。
(4) 函数属于整个文件,可以将实现部分代码置于除@interface...@end外任何位置,可以在main函数内外声明、调用。
对象方法的定义,如:-(void)run;
对象方法的实现,如:-(void)run{ //函数功能实现代码 }
对象方法的使用说明:
(1) 对象方法的声明只能放在@interface...@end之间,对象方法的实现只能放在@implementation...@end之间。
(2) 类方法使用方法类型标识符为‘+’,对象方法的为‘-’。
(3) 对象方法只能由实例化的对象调用,不能像函数那样调用。
(4) 对象方法归类和对象所有,非相同类的对象不能使用该类方法。
如下图所示,Person类的对象person只能调用自己的对象方法,而不能使用Dog类的对象方法,这是因为,使用person对象时,没有Dog类对象方法的代码区地址。
4、使用注意
(1) 类方法不可以调用本类的相同方法,以免引起死循环。
(2) 不访问成员变量,一般使用类方法,减少内存分配。
(3) 方法不能在类声明的“{}”部分。
(4) 方法的声明与实现不能嵌套使用。
(5) 类的成员变量在声明时不能初始化。