C:static 关键字、静态变量、跨类访问数据
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 关键字、静态变量、跨类访问数据的更多相关文章
- JAVA中的static关键字(静态变量和成员变量)
static的特点: 1.static是一个修饰符,用于修饰成员: 2.static修饰的成员被所有的对象所共享: 3.static优先于对象存在,因为static的成员随着类的加载就已经存在了: 4 ...
- java:构造方法:无参构造/有参构造 this static关键字 静态变量 静态方法 代码块 封装 静态常量。
/*构造方法是一种特殊的方法,专门用于构造/实例化对象,形式:[修饰符] 类名(){ }构造方法根据是否有参数分为无参构造和有参构造*/public class Dog { ...
- java===java基础学习(13)---this,static(静态变量和静态方法)的使用
package dog; public class PersonAndDog { public static void main(String[] args) { Dogs da_huang = ne ...
- nginx/apache静态资源跨域访问问题详解
1. apache静态资源跨域访问 找到apache配置文件httpd.conf 找到这行 #LoadModule headers_module modules/mod_headers.so把#注释符 ...
- Context - React跨组件访问数据的利器
Context提供了一种跨组件访问数据的方法.它无需在组件树间逐层传递属性,也可以方便的访问其他组件的数据 在经典的React应用中,数据是父组件通过props向子组件传递的.但是在某些特定场合,有些 ...
- Vue用axios跨域访问数据
Vue用axios跨域访问数据axios是vue-resource的替代品,vue-resource不再维护.安装axios:npm install axios使用vue-cli开发时,由于项目本身启 ...
- 设置IE浏览器跨域访问数据
在开发中,经常会遇到多站点跨域访问后台服务获取数据的情况,解决方法有两种 自己写代理服务,访问代理服务,代理服务请求服务获取数据再返回: 设置浏览器可以跨域访问数据. 本文来讲如何设置IE浏览器跨域访 ...
- 0013 Java学习笔记-面向对象-static、静态变量、静态方法、静态块、单例类
static可以修饰哪些成员 成员变量---可以修饰 构造方法---不可以 方法---可以修饰 初始化块---可以修饰 内部类(包括接口.枚举)---可以修饰 总的来说:静态成员不能访问非静态成员 静 ...
- static 关键字 静态属性与方法 -> :: self $this 区别 可见性的关键字区别
1.声明类属性或方法为静态,就可以不实例化类而直接访问.静态属性不能通过一个类已实例化的对象来访问(但静态方法可以). 2.由于静态方法不需要通过对象即可调用,所以伪变量 $this 在静态方法中不可 ...
随机推荐
- 【chrome错误】Cross origin requests are only supported for protocol schemes: http, data,chrome-extension, https, chrome-extension-reso
使用ajax请求本地文件,chrome会报跨域错误. XMLHttpRequest cannot loadfile:///C:/Users/Li/Desktop/images/alist.json.C ...
- Java屏幕截图工具 捕获屏幕
原文:http://www.open-open.com/code/view/1420037709781 import java.awt.BorderLayout; import java.awt.Co ...
- 基于Lua插件化的Pcap流量监听代理
1.前言 我们在实际工作中,遇到了一个这样的用例,在每天例行扫描活动中,发现有些应用系统不定期的被扫挂,因为我们不是服务的制造者,没有办法在不同的系统里打印日志,所以我们就想用一个工具来获取特定服务的 ...
- BUPT复试专题—查找(2011)
https://www.nowcoder.com/practice/d93db01c2ee44e8a9237d63842aca8aa?tpId=67&tqId=29646&tPage= ...
- js团购倒计时函数代码
<h1>团购啦!</h1><p>还剩<span id="times"></span></p> <SCR ...
- spring中构造函数注入
spring中构造函数注入,简单来说,就是通过beans.xml中,设置对应的值.而且通过bean类中的构造函数进行注入这些值. 文件结构 watermark/2/text/aHR0cDovL2Jsb ...
- 让 Logo "飞" 出屏幕
让 Logo "飞" 出屏幕 推荐序 本文介绍了一种思路,即利用矢量工具来生成动画的关键代码,然后进一步制作成完整的动画效果,感谢作者授权转载. 作者介绍:一缕殇流化隐半边冰霜 ...
- Spark 学习笔记:(四)MLlib基础
MLlib:Machine Learning Library.主要内容包括: 数据类型 统计工具 summary statistics correlations stratified sampling ...
- unity 3D Mesh网络模型,怎样将Constructer拖入场景??
下图中的将Constructer拖入场景,怎么拖入,不知道... 1.Constructer是一个什么东西?在 下图中没有看到这个名字的,于是乎,我就不知道该怎么办了...
- hive增加Update、Delete支持
一.配置hive-site.xml二.建表三.操作四.总结 一.配置hive-site.xml CDH版本先进入Hive配置页 选择高级,找到hive-site.xml 的 Hive 客户端高级配置代 ...