zoukankan      html  css  js  c++  java
  • Objective-c 中的变量

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

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

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

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

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

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

      

     1 #import <Foundation/Foundation.h>
     2 
     3 @interface Test : NSObject{
     4     int _x;  // 实例变量
     5     int _y;
     6 }
     7 
     8 - (void)setX:(int)x;
     9 - (int)x;
    10 
    11 - (void)setY:(int)y;
    12 - (int)y;
    13 
    14 - (void)print;
    15 
    16 @end
    17 
    18 @implementation Test
    19 
    20 - (void)setX:(int)x{
    21     _x = x;
    22 }
    23 - (int)x{
    24     return _x;
    25 }
    26 
    27 
    28 - (void)setY:(int)y{
    29     _y = y;
    30 }
    31 - (int)y{
    32     return _y;
    33 }
    34 
    35 - (void)print{
    36     int i = 1;  // 局部变量
    37     NSLog(@"i = %i",i);
    38     NSLog(@"相加的结果:%i",_x + _y);
    39 }
    40 
    41 
    42 @end
    43 
    44 int main(int argc , const char * argv[]){
    45     @autoreleasepool {
    46         Test *test = [[Test alloc] init];
    47         [test setX:10];
    48         [test setY:10];
    49         NSLog(@"x = %i , y = %i",[test x],[test y]);
    50         [test print];
    51     }
    52     return 0;
    53 }

       理解 static 变量:

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

      

     1 #import <Foundation/Foundation.h>
     2 
     3 @interface Test : NSObject{
     4     
     5 }
     6 - (int)staticIntY;
     7 @end
     8 
     9 @implementation Test
    10 
    11 static int Y = 10;
    12 
    13 - (int)staticIntY{
    14     Y+=1;
    15     return Y;
    16 }
    17 
    18 @end
    19 
    20 int main(int argc , const char *argv[]){
    21     @autoreleasepool {
    22         Test *test = [Test new];
    23         NSLog(@"Y = %i",[test staticIntY]);  // Y = 11;
    24         NSLog(@"Y = %i",[test staticIntY]);  // Y = 12;
    25         
    26     }
    27     return 0;
    28 }

      变量的存储类别:

      前面已经使用了一些变量存储类别的说明符,例如 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;

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

      

     1 #import <Foundation/Foundation.h>
     2 
     3 @interface Test  : NSObject{
     4     
     5 }
     6 
     7 - (void)print;
     8 @end
     9 
    10 @implementation Test
    11 
    12 const double d = 3.14;  // 表示d是不会改变的
    13 
    14 volatile char c = 'c';  // 表示c是随时都可变的
    15 
    16 - (void)print{
    17     auto int i = 10;  // 局部变量
    18     NSLog(@"i = %i",i);
    19     NSLog(@"d = %f",d);
    20     NSLog(@"c = %c",c);
    21 }
    22 
    23 @end
    24 
    25 int main(int argc , const char *argv[]){
    26     @autoreleasepool {
    27         Test *test = [Test new];
    28         [test print];
    29     }
    30     return 0;
    31 }

      

      

  • 相关阅读:
    计算表达式的值并输出,表达式由若干个数字和运算符(只包含加号和减号)构成(C版和python版)
    联机分析场景的关键特征(OLAP)
    C语言字符串去掉指定字符
    主机或者路由器是怎样知道应当在MAC帧的首部填入什么样的硬件地址?(ARP)
    linux虚拟机重置root密码
    python获取时间串的方法
    centos离线安装docker
    前端JavaScript规范
    JQuery中的Deferred-详解和使用
    垂直居中实用三种方式
  • 原文地址:https://www.cnblogs.com/xiaozhai-1234/p/5240487.html
Copyright © 2011-2022 走看看