黑马程序员——OC语言基础---Static关键字使用

来源:互联网 发布:中京商品交易软件 编辑:程序博客网 时间:2024/05/16 13:06

                                                             ------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

Static关键字使用  

1、关于OC中的Static关键字使用  

被static修饰的全局变量或者局部变量,都会放在内存的静态区。最后由系统释放。  

在OC中static关键字使用误区  

        使用static修饰实例变量是不被允许的  

        使用static修饰了方法,也是错误的  

2、在OC中static可以怎么用?  

1、在.h头文件中,可以定义全局静态变量,存在于内存的静态区,仅限于当前类使用。但不能用类名访问(区别于Java);它的声明必须要放在@interface外面;如下: 

<span style="font-size:14px;">static int num = 1;//在头文件中只有这一种使用方式,并且必须加static关键字;@interface Dog: NSObject{     //实例变量不能声明为静态    //   static int _speed;//编译不通过    }//static int num = 1;//定义在这里,编译不通过-(void)dogTest;@end #import "Dog.h"@implementation Dog-(void)dogTest{    num = 100;     NSLog(@"dogTestnum = %d,num的地址 = %p",num,&num);} @end</span>

其他的类可以将这个头文件导入,也可以访问这个num,只不过是将这个num的静态变量为当前这个类完全复制了一份; 

比如: 

<span style="font-size:14px;">#import <Foundation/Foundation.h>#import "Dog.h"//导入dog的类@interface Person : NSObject-(void)personTest;@end#import "Person.h"@implementation Person-(void)personTest{     NSLog(@"personTest num=%d,num的地址=%p",num,&num);}@end<span style="font-family: SimSun; background-color: rgb(255, 255, 255);"> </span></span>

然后我们可以在main函数中将这两个值和地址打印出来: 

int main(int argc, const char *argv[]){     @autoreleasepool {               [[Dog new] dogTest];                Person *per = [Person new];       [per personTest];          }     return 0; }

通过打印结果我们发现:地址不一样,值也不一样;说明他们是两份完全不一样的变量。 

2、在.m实现文件中,可以定义全局变量,它存在于全局静态区中,不可以被其他类操作访问,仅局限与当前类;可以声明在@implementation外面,也可以声明在里面,都一样; 

并且这样声明,如下: 

<span style="font-size:14px;">//static int num = 10;//也可以声明在这里@implementation Dog//静态的全局变量//只能当前文件中使用static int num= 10;-(void)run{     //静态局部变量    //   static int num = 10;   //    num+=1;     NSLog(@"num = %d",num);    //   num++;     }<span style="font-family: SimSun; background-color: rgb(255, 255, 255);"> </span></span>

声明全局变量,不管声明在.h中,还是声明在.m中,它随类的加载而加载,只会初始化一次。 

因为类只会被加载一次。会有默认初始值。 

3,可以定义局部变量和C语言一样,延长变量生命周期 ,加了static关键字的局部变量,存在于全局作用域中。随着程序的运行,这个局部变量只会被初始化一次;

<span style="font-size:14px;">#import "Dog.h"#pragma mark 狗类的实现@implementation Dog-(void)run{    //定义局部静态变量 m   static int m=10;   NSLog(@"m= %d",m); m++;}  @end</span><span style="font-size:12px;"> </span><span style="font-size:12px; font-family: SimSun; background-color: rgb(255, 255, 255);"> </span>

注意:  

在点m文件中,Static型全局变量的可见性,局限于当前.m文件其他的文件中的类,无法访问到该变量


0 0