static 在OC中的使用 参考1   参考2   参考3   参保4    参考5

跨类访问成员 参考

+号方法就是类方法(静态方法),说明不用创建对象,可以直接通过类型去直接调用这个方法,在OC中不能用非静态对象去调用。

-号方法是对象方法,标志-号后的方法必须通过本类的对象或者在本来中才可以使用。

总结:

跨类访问数据使用到的方法有:使用单例(如使用Appdelelgate单例访问数据)、使用 extern 关键字修饰、block 传递、代理传递。

其中使用extern关键字访问全局的数据变量,只需要两步:

(1)在.m的@implementation 的外面定义一个变量

(2)在要使用到的类中 用 extern 修饰你在第一个步骤中定义的变量,就可以跨类访问。

静态变量与自动变量的本质区别是,静态变量并不像自动变量那样使用堆栈机制来使用内存。而是为静态变量分配固定的内存,在程序运行的整个过程中,它都会被保持,而不会被销毁。这就是说静态变量的持续性是程序运行的整个周期。这有利于我们共享一些数据。如果静态变量在函数内部定义,则它的作用域就是在这个函数内部,仅在这个函数内部使用它才有效,但是它不同于自动变量的,自动变量离开函数后就会被销毁,而静态变量不会被销毁。他在函数的整个运行周期内都会存在。在函数外面定义的变量为全局变量,工程内的所有文件都可以访问他,但是它在整个工程内只能定义一次,不能有重复的定义,不然就会发生错误,而其他的文件要想使用这个变量,必须用extern来声明这个变量,这个声明叫做引用声明。这一点很重要,如果你没有用extern 来声明在其他文件中已经定义的全局变量,就来使用它,就会发生错误如果你只是想在定义他的文件中使用它,而不允许在其他的文件中使用它,那么就用关键字static来在函数外面声明变量。这样这个变量在其他文件中将不可见,即它的连接性而内部链接。有一点是我们只得注意的像:如果你在函数外这样声明一个变量,const int a ; 变量a的连接性为内部链接,只能在定义他的文件内使用。还有如果你在定义静态变量的时候并没有给变量初始化,则静态变量将被自动初始化为0;

自动变量,只在定义它们的时候才创建,在定义它们的函数返回时系统回收变量所占存储空间。对这些变量存储空间的分配和回收是由系统自动完成的。一般情况下,不作专门说明的局部变量,均是自动变量。自动变量也可用关键字auto作出说明。例如:
void f()/**/
{/**/
auto int c=3;/*c为自动变量*/
int x=2;/*x未说明存储类型,则为缺省类型(自动)*/
}/**/
自动变量只有一种存储方式,就是存储在栈中。由于自动变量存储在栈中,所以自动变量的作用域只在函数内,其生命周期也只持续到函数调用的结束。[1]
2区别
编辑

自动变量
什么是自动变量呢?自动变量就是指在函数内部定义使用的变量。他只是允许在定义他的函数内部使用它。在函数外的其他任何地方都不能使用的变量。自动变量是局部变量,即它的区域性是在定义他的函数内部有效。当然这说明自动变量也没有链接性,因为它也不允许其他的文件访问他。由于自动变量在定义他的函数的外面的任何地方都是不可见的,所以允许我们在这个函数外的其他地方或者是其他的函数内部定义同名的变量,他们之间不会发生冲突的。因为他们都有自己的区域性,而且它没有链接性(即:不允许其他的文件访问他的)。来看看自动量的持续性。计算机在执行这个函数的时候,创建并为它分配内存,当函数执行完毕返回后,自动变量就会被销毁。这个过程是通过一个堆栈的机制来实现的。为自动变量分配内存就压栈,而函数返回时就退栈。
/* auto */
#include <stdio.h>
int main()
{
int print();
int var,i;
for(i=0;i<=10;i++)
var=print();
printf("%d\n",var);
return 0;
}
int print()
{
auto int i=0; /* 自动变量 */
i+=1;
printf("%d\n",i);
return i;
}
/* end */

静态变量:
静态变量与自动变量的本质区别是,静态变量并不像自动变量那样使用堆栈机制来使用内存。而是为静态变量分配固定的内存,在程序运行的整个过程中,它都会被保持,而不会被销毁。这就是说静态变量的持续性是程序运行的整个周期。这有利于我们共享一些数据。如果静态变量在函数内部定义,则它的作用域就是在这个函数内部,仅在这个函数内部使用它才有效,但是它不同于自动变量的,自动变量离开函数后就会被销毁,而静态变量不会被销毁。他在函数的整个运行周期内都会存在。在函数外面定义的变量为全局变量,工程内的所有文件都可以访问他,但是它在整个工程内只能定义一次,不能有重复的定义,不然就会发生错误,而其他的文件要想使用这个变量,必须用extern来声明这个变量,这个声明叫做引用声明。这一点很重要,如果你没有用extern 来声明在其他文件中已经定义的全局变量,就来使用它,就会发生错误如果你只是想在定义他的文件中使用它,而不允许在其他的文件中使用它,那么就用关键字static来在函数外面声明变量。这样这个变量在其他文件中将不可见,即它的连接性而内部链接。有一点是我们只得注意的像:如果你在函数外这样声明一个变量,const int a ; 变量a的连接性为内部链接,只能在定义他的文件内使用。还有如果你在定义静态变量的时候并没有给变量初始化,则静态变量将被自动初始化为0;
/* static */
#include <stdio.h>
int main()
{
int print();
int var,i;
for(i=0;i<=10;i++)
var=print();
printf("%d",var);
return 0;
}
int print()
{
static int i; /*静态变量*/
i+=1;
printf("%d\n",i);
return i;
}
/* end */

C:static 关键字、静态变量、跨类访问数据的更多相关文章

  1. JAVA中的static关键字(静态变量和成员变量)

    static的特点: 1.static是一个修饰符,用于修饰成员: 2.static修饰的成员被所有的对象所共享: 3.static优先于对象存在,因为static的成员随着类的加载就已经存在了: 4 ...

  2. java:构造方法:无参构造/有参构造 this static关键字 静态变量 静态方法 代码块 封装 静态常量。

    /*构造方法是一种特殊的方法,专门用于构造/实例化对象,形式:[修饰符] 类名(){ }构造方法根据是否有参数分为无参构造和有参构造*/public class Dog {               ...

  3. java===java基础学习(13)---this,static(静态变量和静态方法)的使用

    package dog; public class PersonAndDog { public static void main(String[] args) { Dogs da_huang = ne ...

  4. nginx/apache静态资源跨域访问问题详解

    1. apache静态资源跨域访问 找到apache配置文件httpd.conf 找到这行 #LoadModule headers_module modules/mod_headers.so把#注释符 ...

  5. Context - React跨组件访问数据的利器

    Context提供了一种跨组件访问数据的方法.它无需在组件树间逐层传递属性,也可以方便的访问其他组件的数据 在经典的React应用中,数据是父组件通过props向子组件传递的.但是在某些特定场合,有些 ...

  6. Vue用axios跨域访问数据

    Vue用axios跨域访问数据axios是vue-resource的替代品,vue-resource不再维护.安装axios:npm install axios使用vue-cli开发时,由于项目本身启 ...

  7. 设置IE浏览器跨域访问数据

    在开发中,经常会遇到多站点跨域访问后台服务获取数据的情况,解决方法有两种 自己写代理服务,访问代理服务,代理服务请求服务获取数据再返回: 设置浏览器可以跨域访问数据. 本文来讲如何设置IE浏览器跨域访 ...

  8. 0013 Java学习笔记-面向对象-static、静态变量、静态方法、静态块、单例类

    static可以修饰哪些成员 成员变量---可以修饰 构造方法---不可以 方法---可以修饰 初始化块---可以修饰 内部类(包括接口.枚举)---可以修饰 总的来说:静态成员不能访问非静态成员 静 ...

  9. static 关键字 静态属性与方法 -> :: self $this 区别 可见性的关键字区别

    1.声明类属性或方法为静态,就可以不实例化类而直接访问.静态属性不能通过一个类已实例化的对象来访问(但静态方法可以). 2.由于静态方法不需要通过对象即可调用,所以伪变量 $this 在静态方法中不可 ...

随机推荐

  1. 【Java TCP/IP Socket】Java NIO Socket VS 标准IO Socket

    简介 Java  NIO从JDK1.4引入,它提供了与标准IO完全不同的工作方式. NIO包(java.nio.*)引入了四个关键的抽象数据类型,它们共同解决传统的I/O类中的一些问题.    1. ...

  2. Java全局变量不加修饰符时的访问权限范围

    如上图所示.

  3. Camtasia Studio录制屏幕字迹不清晰的原因

    Camtasia Studio这是一个很优秀的屏幕录像软件,功能强大且录制效果出色,支持众多格式输出: 之前一直用它录制视频的都很正常,但这次换系统后再重新安装后录制视频时,发现输出的视频画质不佳,文 ...

  4. 跟阿根一起学Java Web开发一:开发环境搭建及JSPGen基础配置

    JSPGenSDF软件开发框架(于2014年5月5号公布4.0版).简称JSPGen,专用Java Web方面平台式软件开发,整个框架也能够说是前台与后台的一个粘合剂,如今对JSPGenSDF进行开发 ...

  5. gulp 安装时一直提示缺少模块( Cannot find module 'gulp-load-plugins')

    我们要考虑两种情况? 1. 本地安装和全局安装gulp npm i -g gulp && npm i --save-dev gulp 2.新建package.json,然后手动填写缺少 ...

  6. CCPhysicsSprite

    #ifndef __PHYSICSNODES_CCPHYSICSSPRITE_H__ #define __PHYSICSNODES_CCPHYSICSSPRITE_H__ #include " ...

  7. java开始到熟悉62

    (说明:昨天网络出现了问题导致昨天的没有按时上传,这篇算是昨天的,今天晚上照常上传今天的内容) 本次主题:数组拷贝.排序.二分法 1.数组拷贝 a.java.lang中System 类包含一些有用的类 ...

  8. HDU 5478 Can you find it

    Can you find it Time Limit: 8000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)T ...

  9. Python 005- 使用Pyecharts来绘制各种各样的图形

    本文转载自:https://blog.csdn.net/qq_39143076/article/details/79065448,如有侵权,请联系删除啊 如何做Python 的数据可视化? pyech ...

  10. yum报错File "/usr/bin/yum", line 30 except KeyboardInterrupt, e:

    原因:学python的时候,把centos7自带的python2.7改成了python3.6.2.而yum使用的是python2,所以会出现yum报错. 解决方法: 在文件/usr/bin/yum./ ...