全局变量与静态变量

作者:追风剑情 发布于:2019-2-25 10:36 分类:Objective-C

全局变量:A文件中定义的全局变量能被其他B、C、D、...等文件访问。
静态变量:A文件中定义的静态变量只能被A文件中的代码访问。

示例一:全局变量

Foo.h

#import <Foundation/Foundation.h>

@interface Foo : NSObject
-(void) setgGlobalVar: (int) val;
@end


Foo.m

#import "Foo.h"

// 如果此文件中有多处需要使用gGlobalVar,
// 也可以在文件开始处声明,函数中直接使用即可。
// extern int gGlobalVar;

@implementation Foo

-(void) setgGlobalVar: (int) val
{
    // extern关键字告诉编译器这是全局变量
    extern int gGlobalVar;
    gGlobalVar = val;
}

@end


main.m

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

// 全局变量
int gGlobalVar = 5;

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Foo *myFoo = [[Foo alloc] init];
        NSLog(@"%i", gGlobalVar);
        
        [myFoo setgGlobalVar: 100];
        NSLog(@"%i", gGlobalVar);
    }
    return 0;
}

运行测试
111.png

示例二:静态变量

Fraction.h

#import <Foundation/Foundation.h>

@interface Fraction : NSObject

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

-(void) print;
-(double) convertToNum;
-(void) setTo: (int) n over: (int) d;
-(void) set: (int) n : (int) d;
-(Fraction *) add: (Fraction *) f;
-(void) reduce;
+(Fraction *) allocF;
+(int) count;

@end


Fraction.m

#import "Fraction.h"

@implementation Fraction

@synthesize numerator, denominator;

// 用静态变量记录创建了多少个Fraction对象
// 静态变量不能被文件以外的代码访问
static int gCounter;

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

// 多个参数的方法
-(void) setTo: (int) n over: (int) d
{
    numerator = n;
    denominator = d;
}

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

// 省略参数名的多个参数方法
// 注意,第一个参数名不能省
// 省略参数名不是一种好的编程风格,因为它使程序很难读懂并且很不直观,特别是参数很重要时。
-(void) set: (int) n : (int) d
{
    numerator = n;
    denominator = d;
}

// 分数相加
-(Fraction *) add: (Fraction *) f
{
    // 添加两个分数
    // a/b+c/d=((a*d)+(b*c))/(b*d)
    
    // 创建一个新对象来存储结果
    Fraction *result = [[Fraction alloc] init];
    result.numerator = numerator * f.denominator + denominator * f.numerator;
    result.denominator = denominator * f.denominator;
    
    [result reduce];
    
    return result;
}

// 约分
-(void) reduce
{
    int u = numerator;
    int v = denominator;
    int temp;
    
    while (v != 0) {
        temp = u % v;
        u = v;
        v = temp;
    }
    
    numerator /= u;
    denominator /= u;
}

+(Fraction *) allocF;
{
    // 可以省略extern声明,写上也不会错
    //extern int gCounter;
    ++gCounter;
    
    return [Fraction alloc];
}

+(int) count
{
    //extern int gCounter;
    return gCounter;
}

@end


main.m

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

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Fraction *a, *b, *c;
        
        NSLog(@"Fractions allocated: %i", [Fraction count]);
        
        a = [[Fraction allocF] init];
        b = [[Fraction allocF] init];
        c = [[Fraction allocF] init];
        
        NSLog(@"Fractions allocated: %i", [Fraction count]);
    }
    return 0;
}

运行测试
222.png

标签: Objective-C

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号