您的位置:首页 > 编程语言 > C语言/C++

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

2015-10-06 17:12 357 查看
                                                             ------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文件其他的文件中的类,无法访问到该变量
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息