------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
1. OC中方法的声明调用
方法分类(和C语言相同)有4种:
- 无参无返回值
- 无参有返回值
- 有参无返回值
- 有参有返回值
无参对象方法的声明
对象方法:-(返回值类型)方法名;
有参对象方法声明
-(返回值类型)方法名:(参数类型)参数名 //一个参数的方法
-(返回值类型)方法名:(参数类型)参数名1 and (参数类型)参数名2 //有2个参数的方法
注意:冒号也是方法名的一部分
方法调用
对象方法调用格式:[对象名 对象方法];
类方法调用格式:[类名 类方法];
下面给出有返回值的示例代码:
#import <Foundation/Foundation.h>
@interface Caculator:NSObject
@property int _num1;
@property int _num2;
//无参有返回值方法的声明
-(int)sum;
//有参有返回值方法的声明
-(int)sum:(int)x andY:(int)y;
@end
@implementation Caculator
//无参有返回值方法的实现
-(int)sum{
return __num1+__num2;
}
//有参有返回值方法的实现
-(int)sum:(int)x andY:(int)y{
return x+y;
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
//创建一个Caculator的实例对象ca
Caculator *ca=[Caculator new];
//调用无参有返回值的方法
int sum1= [ca sum];
//调用有参有返回值的方法
int sum2=[ca sum:5 andY:10];
NSLog(@"sum1=%d,sum2=%d",sum1,sum2);
}
return 0;
}
2.对象存储细节
类创建对象,每个对象在内存中都占有一定的存储空间。比如一个Person类创建一个p对象如下:
Person *p=[Person new];
创建对象p的时候申请的空间在内存堆区,实例变量保存在内存堆区,但指针变量p保存在栈区,对象方法保存在代码区。
指针变量p调用方法的过程:首先找到指针变量p中存放的堆区空间首地址,再找到_isa指针,然后找到_isa指向的代码区空间,在空间中找到对应的方法
一个类可以创建多个对象,类在代码区只会加载一次。
3. #prama mark指令
功能:对代码进行分组,方便代码查找导航
eg:
#pragma mark Car类的声明
@interface Car : NSObject
-(void)run;
@end
#pragma mark Caculator类的声明
@interface Caculator : NSObject
-(int)sum;
@end
4. 函数和对象方法的区别
对象方法:
- 对象方法的实现只能写在@implementation @end之间,对象方法的实现只能写在@interface @end之间
- 对象方法以—开头,只能由对象调用
- 对象方法归对象所有
- 函数属于整个文件,可以写在文件的任何位置,包括@implementation @end之间,但写在@interface @end之间无法识别
- 函数中不可以访问对象的实例变量
- 函数是平行关系
- 函数使用的时候可以直接调用
- 类的声明和实现要成对出现,缺一不可
- 声明和实现不能嵌套包含
- 声明和实现的顺序可以打乱但是实现必须在声明之后
- 声明时不能对成员变量初始化
- 成员变量和方法不能用static关键字修饰
- 调用的方法必须要实现 (很重要)
- 成员变量要写在{}里,但是方法不能写在{}里
- 方法不能像函数那样直接调用
对象可以作为方法的参数,也可以作为方法的返回值,示例代码如下:
#import <Foundation/Foundation.h>
@interface Person:NSObject
{
@public
NSString *_name;
int _age;
}
//对象作为方法的参数
-(void)disPerson:(Person*)person;
//对象作为方法的返回值
-(Person*)changeAge:(Person*)person;
@end
@implementation Person
//对象作为方法的参数
-(void)disPerson:(Person*)person{
//打印出传入对象的信息
NSLog(@"姓名=%@,年龄=%d",_name,_age);
}
//对象作为方法的返回值
-(Person *)changeAge:(Person*)person{
//修改传入对象的年龄
person->_age=18;
//把对象返回
return person;
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
Person *p=[Person new];
p->_name=@"张三";
p->_age=20;
//显示为传入对象的信息
[p disPerson:p];
//修改传入对象的年龄
Person *p1=[p changeAge:p];
[p1 disPerson:p1];
}
return 0;
}
6. OC多文件开发
使用多文件:通常把不同的类放到不同的文件中,每个类的声明和实现分开,声明写在.h文件中,实现写在.m文件中,文件名的前缀和类名保持相同。
在主函数及类的实现文件中要使用import包含相应的头文件。