方法与函数
- C与OC函数声明:
C函数声明格式 :double fabs (double a );
⬆️ ⬆️ ⬆️ ⬆️
返回值 函数名 形参类型 形参名
⬇️ ⬇️ ⬇️ ⬇️
OC函数声明格式:NSInteger getValue (NSString *string);
- 方法格式:
方法类型 返回值 方法名 参数类型 参数名
+|- (void) setName:(NSString *) name;
方法的实现
每一个方法的声明必然需要一个方法的实现,一个方法可以不声明直接调用,但是不能不实现直接调用。
实现需要写在
@implementation
关键字和@end
之间,格式如下:
@implementation Person
- (void)sayHello {
NSLog(@"Hello, everyone!");
}
- 方法就是类或者对象的行为(动作),每一个方法结束,必须产生某个结果,可能是值的传递,可能是动作的执行,也可能是算法。
方法类型
类方法
- 类调用的方法,类型标志为
+
号,表示这个抽象的群体去做某件事情。最常用的类方法是创建对象的便利构造方法。格式如下:
+ (Person *)person;
- 类方法需要这样使用(我们通常将这个过程称作“初始化”或者“实例化”):
Person *person = [Person person];
实例方法
- 对象调用的方法,类型标志为
-
号,表示具体的某一个对象去做某件事情。格式如下:
- (void)doSomething;
- 实例方法需要这样使用:
Person *person = [[Person alloc] init];
[person doSomething];
方法形式
1、无参数无返回值
- (void)sayHi {
NSLog(@"Hi");
}
2、无参数有返回值
- (NSString *)drinkTea {
return @"红茶";
}
3、有参数无返回值
- (void)sayHelloWith:(NSString *)name {
NSLog(@"Hello, %@!", name);
}
4、有参数有返回值
- (NSInteger)maxNumberWith:(NSInteger)a b:(NSInteger)b {
return a > b ? a : b;
}
Tips
1、 方法可以有0个或多个参数;
2、如果有参数,每个参数之前需要有一个参数描述,其后添加冒号(
:
),再加上参数类型和形参名;3、如果有多个参数,则需在每个参数之前添加其参数描述;
4、如果有多个参数,方法名字是所有参数描述的集合(需带上冒号),如下:
+ (Person *)personWithName:(NSString *)name age:(NSInteger)age;
方法名为:
personWithName: age:
方法调度程序
对象收到消息后,如何来调用这些方法?
- OC中不含继承的方法调度流程:
初始化对象 ->询问是否能调用该方法 -> 能 ? 直接调用 : 报错;
- OC中含继承的方法调度流程:
初始化对象 -> 直接调用本类存在方法 -> 查询父类是否能调用方法 -> 能 ? 直接调用 : 报错;
- OC中使用
super
关键字的方法调度流程:
初始化对象 -> 询问是否能够调用该方法 -> 能 ? 直接调用 : 报错 或 一直查找父类(有 ? 调用 : 报错);
setter 与 getter 方法
对于实例变量值的存和取,分别对应setter和getter两个实例方法,增加方法后,可在本类或者其他类的方法中使用这2个方法。
setter 方法,给实例变量一个指定的值;
getter 方法,获取实例变量的值;
1、setter 与 getter 方法声明方式:
#import <Foundation/Foundation.h>
@interface Person : NSObject {
// 成员变量
NSString *_name;
}
#pragma mark - setter && getter
// 取值
- (NSString *)name;
// 设值
- (void)setName:(NSString *)name;
@end
2、setter 与 getter 方法实现方式:
#import "Person.h"
@implementation Person
- (NSString *)name {
return _name;
}
- (void)setName:(NSString *)name {
_name = name;
}
@end
3、setter 与 getter 方法调用方式:
#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
#pragma mark - setter && getter
// 初始化对象
Person *person = [[Person alloc] init];
// 调用 setter 方法赋值
[person setName:@"Admin"];
// 调用 getter 方法取值
NSString *name = [person name];
NSLog(@"person name is '%@'.", name); // 输出 person name is 'Admin'.
}
return 0;
}
Tips
1、如果实现 setter 与 getter 方法,则可直接使用点语法,具体如下:
setter调用:
person.name = @"Admin";
getter调用:
NSString *name = person.name;
description 方法
子类可以重写父类方法,NSObject有一个方法为descrption。
该方法返回NSString,用于描述该对象。
当使用
NSLog(@"%@", 对象);
时,会默认调用该对象的description方法。如果我们不重写此方法会默认调用NSObject的该方法,返回形如:
<类名:地址>
的数据。子类中重写该方法可以返回自定义对象信息。