iOS方法

  • 类方法

以+开头的方法,又称为静态方法,一般情况下是有返回值的。
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;

你可能感兴趣的:(iOS方法)