全局变量: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;
}
示例二:静态变量
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;
}