说说iOS中的常用的关键字static ,class(仅限Swift关键字)

本文说说static在iOS中的作用包括OC和Swift,并讲解常用的情况.代码主要以OC为主,Swift中主要描述和另外一个关键字class的异同

当static修饰局部变量时

变量在内存中的位置: 当用static修饰局部变量时,局部变量的内存地址会从栈变为全局区(静态区).

作用域:只在函数内部可见,只初始化一次,所以也只有一个内存地址.

生命周期程序结束时才释放.

- (void)viewDidLoad {

[super viewDidLoad];

[self tobeYoung];

[self tobeYoung];

[self tobeYoung];

static int age = 20;//使用static修饰的局部变量,在其他的函数中声明相同变量名的变量时,是一个全新的变量

NSLog(@"age===%d",age);

// Do any additional setup after loading the view, typically from a nib.

}

- (void)tobeYoung {

static int age = 10;

age--;

NSLog(@"age===%d",age);

}

// 控制台的输出结果

2018-11-29 22:46:31.602384+0800 static[1260:222387] age===9

2018-11-29 22:46:31.602557+0800 static[1260:222387] age===8

2018-11-29 22:46:31.602672+0800 static[1260:222387] age===7

2018-11-29 22:46:31.602758+0800 static[1260:222387] age===20

//每次的输出结果都不一样,被static修饰的局部变量内存地址只有一份,只被初始化一次,所有第二次调用tobeYoung方法时age没有被重新初始化,所以是9,9--之后就是输出8了

常用情况讲解:我们经常在tableViewcell复用的时候使用到static,为什么需要在局部变量identifier之前加上static.我们先看看常用的写法.


-(nonnull UITableViewCell*)tableView:(nonnull UITableView*)tableView cellForRowAtIndexPath:(nonnull NSIndexPath*)indexPath{

staticNSString*identifier=@"cellIdentifier";

UITableViewCell*cell=[tableView dequeueReusableCellWithIdentifier:identifier];i

f(!cell){

cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];

}

returncell;

}

tableview的这个代理方法是一个会被反复调用的方法,当identifier的前面不加static修饰时,identifier这个临时变量是储存在栈中的,指向常量区中的@"cellIdentifier",一旦这个代理方法执行完毕,identifier这个局部变量就会被回收.当再次调用的时候又会重新生成一个局部变量重新指向常量区的@"cellIdentifier".,消耗内存.

当使用static修饰identifier时,identifier的内存就会被分配在全局区(静态区),生命周期会变成这个程序的运行时间,不会随着代理方法调用完毕而销毁,一直指向常量区的@"cellIdentifier".当再次调用时不需要重新生成.节省内存.

当static修饰全局变量时

内存中的位置 :仍然是在静态储存区没变,生命周期为整个程序运行期间.

作用域 :在整个声明它的文件中可用,在声明他之外的文件之外不可见.

常用情况:iOS中的单例中的全局变量会用static修饰.

#import"Singleton.h"

@implementationSingleton

static Singleton*instance=nil;

+(Singleton*)getInstance{

if(instance==nil){

instance=[[Singleton alloc]init];

}

return instance;

}

+(id)allocWithZone:(struct_NSZone*)zone{

if(instance==nil){

instance=[superallocWithZone:zone];

}

returninstance;

}

-(id)copyWithZone:(struct_NSZone*)zone{

returninstance;

}

@end

为什么一定要用static 来修饰变为一个静态变量,而不是写成一个实例变量.因为单例是程序生命周期中唯一的实例,为确保实例化的唯一.而利用类的类方法来生成,而在类方法中不可以使用实例对象的变量,只能使用属于类的(static)类变量(一般在OC中没有特意区分static变量和类变量的区别).而且在声明它之外的文件不可见.

/**

    在其他的类中实用extern来访问

    */extern Singleton * instance;NSLog(@"instance====%@",instance);直接无法编译过会直接报错    Undefined symbols for architecturex86_64:"_instance",referencedfrom:-[ViewController viewDidLoad] in ViewController.old:symbol(s)not found for architecture x86_64clang:error:linker command failed with exit code 1(use -v to see invocation)

在Swift中static的使用(包含与关键字class的异同)

说道Swift中的static那就不得不说到另一个关键字class,在Swift中static和class都是用来描述类型作用域这一概念.两者都可以用来修饰计算类型.都可以用来修饰方法,static修饰的方法叫做静态方法,class修饰的是类方法.(在OC中我们不会特别的区分类方法,类变量,静态方法,静态变量),但是在Swift中class和static,无论是能够修饰的范围还是修饰后产生的效果区别都很大,不能混为一谈.

class 和 static相同点

都可以在class中修饰方法,static修饰的叫做静态方法,class修饰的叫做类方法.

都可以修饰class中的计算属性

classProgrammer:NSObject{staticvarname:String{return"老王"}classvarnickname:String{return"王重阳"}classfuncwriteTheCode()->Void{print("写代码")}staticfuncfixTheBug()->Void{print("修复bug")}}

class 和static中的不同点

首先class修饰的属性和方法可以被子类重写,但是static不能被重写.

image

class修饰的类方法被重写时,可以使用static修饰,让方法变成静态方法,但它的子类就不能重写了.

class修饰的计算属性被重写时,可以使用static修饰,让其变成静态变量,但它的子类就不能重写了.

classiOSProgrammer:Programmer{// 重写计算属性 可以使用static 来重写,但是static 重写后,就不能被它的子类再次重写了staticoverridevarnickname:String{return"iOS王重阳"}// 重写类方法时可以使用static 让其变成静态方法staticoverridefuncwriteTheCode()->Void{print("写代码")}}

其次class 和static能够修饰的范围不一样,class只能在class中修饰,而static可以不仅可以作用于class中,也可以在enum,和struct中使用.

image

通篇有限今天暂时到此为此,如有错误,希望大家帮忙在评论中指出,欢迎大家来交流沟通.

作者:走在变瘦的路上

链接:https://www.jianshu.com/p/29c3fd0430e3

来源:简书

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,802评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,109评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,683评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,458评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,452评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,505评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,901评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,550评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,763评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,556评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,629评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,330评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,898评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,897评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,140评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,807评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,339评论 2 342

推荐阅读更多精彩内容