OC中的语言变量,按作用域可分为两种:局部变量和全局变量。

  局部变量:也称为内部变量,局部变量是在方法内部声明的。其作用域仅限于方法内,离开该方法再使用这个变量就是非法的。

  全局变量:也称为外部变量,它是方法外部定义的变量。它不属于哪一个方法,而属于一个源程序文件,其作用域是整个源程序。全局变量的说明符为:extern ,比如:extern int intX;

  如果一个源文件中的外部变量与局部变量同名,则在局部变量的作用范围内,外部变量被“屏蔽”,而不起作用。通常尽量不使用 extern 变量。

  在类中的实例变量,是可以在各个方法内使用。在这些实例变量上,你可以设置访问控制。

  下面举例来说明局部变量和实例变量的区别:

  

 #import <Foundation/Foundation.h>

 @interface Test : NSObject{
int _x; // 实例变量
int _y;
} - (void)setX:(int)x;
- (int)x; - (void)setY:(int)y;
- (int)y; - (void)print; @end @implementation Test - (void)setX:(int)x{
_x = x;
}
- (int)x{
return _x;
} - (void)setY:(int)y{
_y = y;
}
- (int)y{
return _y;
} - (void)print{
int i = ; // 局部变量
NSLog(@"i = %i",i);
NSLog(@"相加的结果:%i",_x + _y);
} @end int main(int argc , const char * argv[]){
@autoreleasepool {
Test *test = [[Test alloc] init];
[test setX:];
[test setY:];
NSLog(@"x = %i , y = %i",[test x],[test y]);
[test print];
}
return ;
}

  理解 static 变量:

  被 static 修饰的变量称为静态变量。静态变量有以下优点:可以节省内存,因为它是所有对象所公有的,因此,对多个对象来说,静态变量只存储一处,供所有对象共用。静态变量的值对每个对象都一样,但它的值是可以更新的。只要某一个对象对静态变量的值更新一次,所有对象都能访问更新后的值,这样可以提高效率。下面通过代码来演示它的用法:

  

 #import <Foundation/Foundation.h>

 @interface Test : NSObject{

 }
- (int)staticIntY;
@end @implementation Test static int Y = ; - (int)staticIntY{
Y+=;
return Y;
} @end int main(int argc , const char *argv[]){
@autoreleasepool {
Test *test = [Test new];
NSLog(@"Y = %i",[test staticIntY]); // Y = 11;
NSLog(@"Y = %i",[test staticIntY]); // Y = 12; }
return ;
}

  变量的存储类别:

  前面已经使用了一些变量存储类别的说明符,例如 extern 和 static,下面将介绍另外三个变量存储类别的说明符:

  1. auto 用于声明一个自动全局变量,是方法内部变量的声明方式,一般省略它,比如:auto int x = int x;

   注意:自动变量没有默认的初始值,除非我们显示的给它赋值,否则它的值不是确定的。

  2. const 可声明程序中的值为不可改变的值,它会告诉编译器,这个变量在程序的运行期间都有恒定的值。是一个常数,例如:const double pi = 3.14;

  3. volatile 这个修饰符和 const 修饰符相反,它告诉编译器,该变量的值会发生改变。例如:

  *char1 = 'a';

  *char1 = 'b';

  如果没有使用 volatile ,那么,当编译器遇到这两行代码的时候,因为这是对一个地址进行两次连续的赋值,所以编译器就将第一个语句从程序中删除掉。为了防止这种情况出现。应该把 char1 声明为一个 volatile 变量;

  volatile char *char1;

  下面通过一个例子来演示一下这三个标识符的用法:

  

 #import <Foundation/Foundation.h>

 @interface Test  : NSObject{

 }

 - (void)print;
@end @implementation Test const double d = 3.14; // 表示d是不会改变的 volatile char c = 'c'; // 表示c是随时都可变的 - (void)print{
auto int i = ; // 局部变量
NSLog(@"i = %i",i);
NSLog(@"d = %f",d);
NSLog(@"c = %c",c);
} @end int main(int argc , const char *argv[]){
@autoreleasepool {
Test *test = [Test new];
[test print];
}
return ;
}

  

  

Objective-c 中的变量的更多相关文章

  1. 浅谈Objective—C中的面向对象特性

    Objective-C世界中的面向对象程序设计 面向对象称程序设计可能是现在最常用的程序设计模式.如何开发实际的程序是存在两个派系的-- 面向对象语言--在过去的几十年中,很多的面向对象语言被发明出来 ...

  2. MFC中成员变量的声明顺序与析构顺序

    第一次用博客,第一篇随笔,就写今天遇到的一个问题吧. 在VS2008的MFC对话框程序,窗口成员变量的声明顺序与其析构顺序相反,即,先声明的变量后析构,后声明的变量先析构.未在其他模式下测试. cla ...

  3. JavaScript 中的变量命名方法

    三种命名方法 在程序语言中,通常使用的变量命名方法有三种:骆驼命名法(CamelCase),帕斯卡命名法(PascalCase)和匈牙利命名法. 依靠单词的大小写拼写复合词的做法,叫做"骆驼 ...

  4. linux中shell变量$#,$@,$0,$1,$2的含义解释

    linux中shell变量$#,$@,$0,$1,$2的含义解释: 变量说明: $$ Shell本身的PID(ProcessID) $! Shell最后运行的后台Process的PID $? 最后运行 ...

  5. PHP中的变量与常量详解

    几乎所有的编程语言都会涉及到变量和常量这两个概念,PHP也不例外.本节将介绍PHP语言中的变量和常量的应用方法. 一.什么是变量和常量 在程序执行的过程中,变量存储的值可以随时改变,而常量存储的值是不 ...

  6. Linux中环境变量文件及配置

    Linux中环境变量文件及配置   一.环境变量文件介绍 转自:http://blog.csdn.net/cscmaker/article/details/7261921 Linux中环境变量包括系统 ...

  7. mysql查询语句中用户变量的使用

    先上代码吧 SELECT `notice`.`id` , `notice`.`fid` , `notice`.`has_read` , `notice`.`notice_time` , `notice ...

  8. java中打印变量地址

    在java中打印变量的地址 这个代码是在startoverflow上看到的,跟大家分享一下. import sun.misc.Unsafe; import java.lang.reflect.Fiel ...

  9. js中的变量小例子

    s中的变量function foo(){ n=99;}alert(n);//undefined,因为没有调用该函数 function foo(){ n=99;}foo();alert(n);//99, ...

  10. js for 循环中的 变量问题。

    今日处理项目中的一个循环,本来就是一个小小的for循环,后来发现该段程序出现了问题,仔细检查代码没有发现其中的错误.无奈只好叫来了老大帮忙.通过在模版中断点调试(该方式只能自己写debugger断点) ...

随机推荐

  1. 关于javascript跨域及JSONP的原理与应用

    同源策略,它是由Netscape提出的一个著名的安全策略,现在所有的可支持javascript的浏览器都会使用这个策略. 为什么需要同源策略,这里举个例子: 假 设现在没有同源策略,会发生什么事情呢? ...

  2. 转:onkeypress、onkeydown、onkeyup 区别

    在使用JavaScript做WEB键盘事件侦听捕获时,主要采用onkeypress.onkeydown.onkeyup三个事件进行出来.该三个事件的执行顺序如下:onkeydown -> onk ...

  3. image.xx.com 通过haproxy 跳转到内部图片服务器

    <pre name="code" class="html">http://www.hyyche.com/#main C:\Users\Adminis ...

  4. 面向对象程序设计-C++_课时22向上造型

    赋值兼容规则是指在公有派生情况下,一个派生类的对象可以作为基类的对象来使用的情况. 约定类derived是从类base公有派生而来的,则指如下3种情况: (1)派生的对象可以赋给基类的对象.例如: d ...

  5. python 【第三篇】:函数及参数

    函数背景 在学习函数之前,一直遵循:面向过程编程: 根据业务逻辑从上到下实现功能,其往往用一长段代码来实现指定功能,开发过程中最常见的操作就是粘贴复制,也就是将之前实现的代码块复制到现需功能处,如下: ...

  6. PHP 面向对象:设计模式之单例模式

    单例模式要解决的问题就是“如何让这个类只有一个实例”. 我们的web应用中,大量使用了数据库连接,如果反复建立与数据库的连接必然消耗更多的系统资源. 我们如何解决这个问题,建立唯一的数据库连接是必要的 ...

  7. mysql关联更新

    update tb_sdd_info a,tb_bnm_evian_info b set a.username=b.username where a.username=b.memberno and  ...

  8. JavaScript之call()和apply()方法详解

    简介:apply()和call()都是属于Function.prototype的一个方法属性,它是JavaScript引擎内在实现的方法,因为属于Function.prototype,所以每个Func ...

  9. SQL学习之学会使用子查询

    1.SELECT语句是SQL的查询.我之前的随笔中所用的SELECT语句都是简单的查询,即从单个数据库表中检索数据的单条SELECT语句. 查询:任何SQL语句都是查询,但此术语一般指SELECT语句 ...

  10. [转]oracle误删数据的恢复

    与数据打交道,免不了会误删一些数据,之后还commit了,连回滚的机会都没了,而更糟糕的是你又没有备份,这种事终于在今天被我不幸的遇上了... 唯一一点值得欣慰的是,我删除表记录的时候,时间不长,一天 ...