在.NET中咱们静态使用的关键字static有着举足轻重的做用,static 方法能够不用实例化类实例就能够直接调用,static 属性也是如此。在Object C中也存在static关键字,今天的学习过程使用到了这个关键字,在这里记录一下static的使用。html
在Object C的语法中声明后的static静态变量在其余类中是不能经过类名直接访问的,它的做用域只能是在声明的这个.m文件中 。不过能够调用这个类的方法间接的修改这个静态变量的值。对于Object C中的类使用和定义在前面已经作过相应的记录,能够查看Object C学习笔记3-对象的使用和定义。ide
1. 静态属性学习
Object C中静态属性的定义和.NET中的有点不同,先看看以下代码:测试
#import <Foundation/Foundation.h> @interface Person : NSObject { int age; NSString *name; static int totalCount; } @property int age; @property NSString *name; -(void) write; +(void) hello; @end
以上代码定义 static int totalCount; 这样在编译器中编译会报错,这样的代码编写对于编译器是不承认的。正确的定义放入以下:spa
#import <Foundation/Foundation.h> @interface Person : NSObject { int age; NSString *name; } @property int age; @property NSString *name; -(void) write; +(void) hello; @end
#import "Person.h" static int count; @implementation Person @synthesize age; @synthesize name; -(void) write { NSLog(@"姓名:%@ 年龄:%i",name,age); } +(void) hello { count++; NSLog(@"static = %i",count); } @end
static 属性应该定义在implementation中,并且写在implementation以外或者方法之中。以上代码是将static 属性写在implementation以外。code
@autoreleasepool { for(int i=0;i<5;i++){ [Person hello]; } } 测试结果 2014-02-15 22:03:14.642 Object11[488:303] static = 1 2014-02-15 22:03:14.644 Object11[488:303] static = 2 2014-02-15 22:03:14.644 Object11[488:303] static = 3 2014-02-15 22:03:14.645 Object11[488:303] static = 4 2014-02-15 22:03:14.645 Object11[488:303] static = 5
从以上代码能够看出,调用hello方法直接使用类名Person而非Person的实例,并且每次调用以后count都会+1.orm
2. static属性在方法中htm
修改代码以下,将static属性改到方法中。对象
#import "Person.h" @implementation Person @synthesize age; @synthesize name; -(void) write { NSLog(@"姓名:%@ 年龄:%i",name,age); } +(void) hello { static int count; count++; NSLog(@"static = %i",count); }
使用如上方式和1中的效果同样,static属性是属于类全局的,看看测试代码就知道效果如何:blog
@autoreleasepool { for(int i=0;i<5;i++){ [Person hello]; } } //测试结果 2014-02-15 22:12:04.681 Object11[528:303] static = 1 2014-02-15 22:12:04.683 Object11[528:303] static = 2 2014-02-15 22:12:04.684 Object11[528:303] static = 3 2014-02-15 22:12:04.685 Object11[528:303] static = 4 2014-02-15 22:12:04.685 Object11[528:303] static = 5
效果和前面的是同样的。下面再看看在实例方法中定义static 属性看看效果以下,修改代码以下:
#import "Person.h" @implementation Person @synthesize age; @synthesize name; -(void) write { static int myage=0; myage++; NSLog(@"年龄:%i",myage); } +(void) hello { static int count; count++; NSLog(@"static = %i",count); }
测试实例方法中的静态属性测试方法以下:
@autoreleasepool { for(int i=0;i<5;i++){ Person *p=[[Person alloc] init]; p.name=[NSString stringWithFormat:@" %@ %i",@"object c",i]; [p write]; } } //测试结果以下 2014-02-15 22:20:35.161 Object11[582:303] 姓名: object c 0 年龄:1 2014-02-15 22:20:35.163 Object11[582:303] 姓名: object c 1 年龄:2 2014-02-15 22:20:35.164 Object11[582:303] 姓名: object c 2 年龄:3 2014-02-15 22:20:35.164 Object11[582:303] 姓名: object c 3 年龄:4 2014-02-15 22:20:35.164 Object11[582:303] 姓名: object c 4 年龄:5
从以上测试代码能够看出,static 属性定义到实例方法中一样适用,在调用的循环过程当中for不断实例化新的实例,name属性在发生变化,而count保留上次运行的结果,这也就是static的做用。
3. 静态方法
在.NET中定义静态方法也须要适用static 关键字,可是在Object C并不是如此。在以前咱们定义方法的时候都是以下格式:
- (返回值类型) 方法名: 参数,...
适用静态方法 就是将 "-" 改成 "+" 便可。
+(void) hello; 在interface中定义如上方法签名,而在implementation中实现这个方法。
静态方法的时候在上面的例子中已经提到过了,可详细参考!