-
类方法
以+开头的方法,又称为静态方法,一般情况下是有返回值的。
1、不需要实例化就可以调用。
2、类方法可以调用类方法。
3、类方法不可以调用实例方法,但是类方法可以通过创建对象来访问实例方法。
4、类方法中不能访问属性和实例变量,只能访问类对象,但是可以通过创建实例对象来访问属性。
5、类方法里调用的self是类本身class。
+(NSString *)print{
NSString *str = @"";
return str;
}
-
实例方法
以 - 开头的方法。
1、必须通过实例化的对象调用。
2、可以访问属性,实例变量,类对象。
-(void)print{
NSLog(@"11");
}
setter方法和getter方法,在使用这两个方法前,首先要声明自己的变量。
我的理解:setter方法就是要给自己的变量赋值;getter方法就是获取自己变量的值。
-
setter方法
写法:-(void)setYourValue:(你的变量是什么类型就写什么类型)value;
-
getter方法
写法:-(void)yourValue;
.h文件
@interface SuperCls : NSObject
/**
setter方法
*/
-(void)setNum:(int)num;
/**
getter方法
*/
-(int)num;
@end
.m文件
@interface SuperCls ()
{
int numMember;//成员变量
}
@end
@implementation SuperCls
-(void)setNum:(int)num{
numMember = num;
}
-(int)num{
return numMember;
}
调用
先引入头文件#import "SuperCls.h"
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
self.view.backgroundColor = [UIColor whiteColor];
SuperCls *sCls = [SuperCls new];
//传统调用方式
[sCls setNum:10];
int value1 = [sCls num];
NSLog(@"value = %d",value1);//这里的打印结果:value1 = 10
//.语法调用方式
sCls.num = 20;
int value2 = sCls.num;
NSLog(@"value = %d",value2);//这里的打印结果:value2 = 20
/**
通过上面两种调用方式不难看出:
.出现在 = 左边的时候,相当于setter方法
.出现在 = 右边的时候,相当于getter方法
*/
}
那么有没有什么方法不要写这么多代码呢?答案是肯定的:用property声明实例变量
我们使用property声明变量的时候,编译器会自动帮我们声明setter方法和getter方法,忘记是在Xcode的哪个版本之前,我们用property声明变量的时候,要在.m文件的@implementation和@end中间要用synthesize声明变量,并且synthesize会自动帮我们实现set和get方法。后来Xcode升级之后,干脆synthesize都不用写了,property已经强大到帮我们做了所有的事。
-
property的作用
1、生成私有成员变量;
2、生成私有成员变量的setter和getter方法的声明;
3、生成私有成员变量的setter和getter方法;
-
synthesize的作用
1、让编译器自动生成setter与getter方法;
2、指定与属性对应的实例变量;
-
另外说明
如果我们声明的变量是readonly类型的,编译器不会帮我们实现setter方法。因为
readonly:表示只有getter,没有setter。
readwrite:表示既有getter,也有setter。
readonly和readwrite两个属性不能同时存在,只能同时出现一个。
重写setter和getter方法
同时重写这两个方法的时候,有一个要注意的地方。例如要重写一个叫做name的属性的setter和getter方法,一定要用synthesize声明一次这个属性,因为同时重写了setter 和getter方法,系统会把这个name属性重新生成一个新的变量_name;_name和name就变成了两个完全不一样的东西,所以需要我们手动为这个新的变量_name声明一下:@synthesize name = _name;