自动生成getter和setter方法

作者:追风剑情 发布于:2019-2-21 12:15 分类:Objective-C

示例一:利用@property@synthesize指令自动生成getter和setter

Fraction.h

#import <Foundation/Foundation.h>

@interface Fraction : NSObject

//@property指令让编译器自动为numerator、denominator生成getter、setter方法
@property int numerator, denominator;

-(void) print;
-(double) convertToNum;

@end


Fraction.m

#import "Fraction.h"

@implementation Fraction

//@synthesize与@property指令配合使用来自动生成getter、setter方法
//会自动生成设值方法setNumerator、setDenominator
//会自动生成取值方法numerator、denominator
@synthesize numerator, denominator;

-(void) print
{
    NSLog(@"%i/%i", numerator, denominator);
}

-(double) convertToNum
{
    if (denominator != 0)
        return (double) numerator / denominator;
    else
        return NAN;
}

@end


main.m

#import <Foundation/Foundation.h>
#import "Fraction.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Fraction *myFraction = [[Fraction alloc] init];
        
        //[myFraction setNumerator: 1];
        //[myFraction setDenominator: 3];
        //使用点语法设值(即,调用setter方法),与上面两句代码等价
        myFraction.numerator = 1;
        myFraction.denominator = 3;
        
        
        NSLog(@"The numerator is %i, and the denominator is %i",
              myFraction.numerator, myFraction.denominator);
        
        
    }
    return 0;
}


运行测试

2.png

示例二:省略@synthesize指令

Fraction.h

#import <Foundation/Foundation.h>

@interface Fraction : NSObject

//@property指令让编译器自动为numerator、denominator生成getter、setter方法
@property int numerator, denominator;

-(void) print;
-(double) convertToNum;

@end


Fraction.m

#import "Fraction.h"

@implementation Fraction

//@synthesize与@property指令配合使用来自动生成getter、setter方法
//会自动生成设值方法setNumerator、setDenominator
//会自动生成取值方法numerator、denominator
//@synthesize numerator, denominator;

-(void) print
{
    //如果省略了@synthesize指令,那么实例变量前要加下画线。
    NSLog(@"%i/%i", _numerator, _denominator);
}

-(double) convertToNum
{
    //如果省略了@synthesize指令,那么实例变量前要加下画线。
    if (_denominator != 0)
        return (double) _numerator / _denominator;
    else
        return NAN;
}

@end


main.m

#import <Foundation/Foundation.h>
#import "Fraction.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Fraction *myFraction = [[Fraction alloc] init];
        
        //[myFraction setNumerator: 1];
        //[myFraction setDenominator: 3];
        //使用点语法设值(即,调用setter方法),与上面两句代码等价
        myFraction.numerator = 1;
        myFraction.denominator = 3;
        
        
        NSLog(@"The numerator is %i, and the denominator is %i",
              myFraction.numerator, myFraction.denominator);
        
        
    }
    return 0;
}


运行测试
2.png

注意:你并不需要使用@synthesize指令,使用@property指令就足够了。编译器会自动为你生成setter和getter。但是,注意,如果不使用@synthesize,那么编译器生成的实例变量会以下画线(_)字符作为其名称的第一个字符。

注意:点运算符通常用在属性上,用于设置或取得实例变量的值。做其他工作的方法通常不是由点运算符执行的,而是使用传统的方括号形式的消息表达式作为首选的语法。

注意:使用合成(synthesize)的存取方法,属性名称的前面不要以new、alloc、copy或者init这些词开头。这与编译器的一些假定有关,因为编译器会合成相应的方法,内存管理和引用计数会有更详细的描述。


标签: Objective-C

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号