全局函数(C语言函数)
一般在头文件中定义,在实现文件中实现这个函数。可在任意位置去调用它。也可用OC的对象作为参数或返回值。
成员函数
1.实例方法(表达的是实例的行为)
1.1 定义:在接口头文件中定义方法,在实现类文件中去实现方法行为。
-(返回值)方法名:(参数类型)参数名;
// 接口头文件
-(void)sleep:(int)hour;
// 实现类文件
-(void)sleep:(int)hour{
NSLog(@"%@ 休息 %d 小时",self.name, hour);
}
1.2.调用
Human* human = [[Human alloc] init];
[human sleep:3]; //[对象名 方法名]
方法内可访问的成员:实例成员(实例变量、属性、实例方法、类方法、静态变量)
2.类方法(表达的是类的行为)
+(返回值)方法名:(参数类型)参数名 对外参数名:(参数类型)参数名;
+(bool)marryToA:(Human *)a ToB:(Human *)b;
2.1.调用
[Human marryToA:tim ToB:jane]; //[类名 方法名:参数 外部参数名:参数];
类方法内访问成员:类方法、静态变量
不可访问:实例成员(实例变量、方法、属性)
注意:
OC中的所有方法默认就是Public的,没有private或prodected方法,但是可以通过扩展的方法实现类似的功能。
动态消息分发:方法的调用是通过运行时动态消息分发实现,在对象上调用方法又称“向对象发送消息”。
3.方法参数
如果参数类型是值类型,则为传值方式,如果参数类型为引用类型 则为传指针方式。
方法可以有参数,也可以没有参数。
如果方法有参数,方法名约定包含第一个参数名,从第二个参数开始需要显示提供外部参数名。
+(bool)marryToA:(Human *)a ToB:(Human *)b;
在调用时,第一个参数名是忽略,但后面的参数名会显示。
[Human marryToA:tim ToB:jane];
注意:方法名 返回值 参数类型 等都相同,但外部参数名不同,属于不同的方法。
4.动态方法调用机制
id human = [[Human alloc] init];
[human sleep:3];
通过id引用的对象在调用属性时不可以用.的方式,但可以用访问器方法。
支持运行时动态加入方法。详细了解 OC的运行时机制。
5.初始化器 init
初始化器方法可以重载多个,在我们实例化对象的时候,会调用init方法,系统默认为我们的类添加init方法,它将我们的实例变量初始化为0或nil。我们也可以自定义init方法来初始化类的变量值。
5.1.定义
// 接口头文件中
-(id)initWithName:(NSString *)aName WithGender:(NSString *)aGender;
-(id)initWithName:(NSString *)aName WithGender:(NSString *)aGender WithAge:(int)aAge;
// 实现类文件中
-(id)initWithName:(NSString *)aName WithGender:(NSString *)aGender{
return [self initWithName:aName WithGender:aGender WithAge:0];
}
-(id)initWithName:(NSString *)aName WithGender:(NSString *)aGender WithAge:(int)aAge{
self = [super init];
if (self) {
_name = aName;
_gender = aGender;
_age = aAge;
}
return self;
}
注意:在初始化器中,一定要调用父类初始化器方法获取到self对象(前置调用),并判断是否获取到对象。
5.2.使用
Human* human = [[Human alloc] initWithName:@"Jane" WithGender:@"woman" WithAge:23];
实例化对象的另一种方式:
Human* human = [Human new]; // 等同于 Human* human = [[Human alloc] init]; //init 无参数版本
6.类加载器 initialize
子类的加载器会调用父类的加载器,所以如果重写这个方法,需要判断当前self的类型。
6.1.定义
// 接口头文件中
+(void)initialize;
// 实现类文件中
+(void)initialize{
if (self == [Human class]) {
...
}
}
注意:类被加载时被系统自动调用,每个进程周期中只会被调用一次。相当于JAVA类中的静态代码块。
6.析构器 dealloc
析构器在类中只存在一个,用于释放对象拥有的动态资源,是实例方法。一般的对象由ARC自动释放,但对于一些不受ARC管理的动态内存,如malloc分配的内存,就需要在dealloc中手动释放了。另外还有非内存资源,如果文件句柄等。
子类的构造器会调用父类的构造器(后置调用)。
6.1.定义
// 接口头文件中
-(void)dealloc;
// 实现类文件中
-(void)dealloc{
...
[super dealloc];
}