Object C学习笔记10-静态方法和静态属性

简介:   在.NET中我们静态使用的关键字static有着举足轻重的作用,static 方法可以不用实例化类实例就可以直接调用,static 属性也是如此。在Object C中也存在static关键字,今天的学习过程使用到了这个关键字,在这里记录一下static的使用。

  在.NET中我们静态使用的关键字static有着举足轻重的作用,static 方法可以不用实例化类实例就可以直接调用,static 属性也是如此。在Object C中也存在static关键字,今天的学习过程使用到了这个关键字,在这里记录一下static的使用。

  在Object C的语法中声明后的static静态变量在其他类中是不能通过类名直接访问的,它的作用域只能是在声明的这个.m文件中 。不过可以调用这个类的方法间接的修改这个静态变量的值。对于Object C中的类使用和定义在前面已经做过相应的记录,可以查看Object C学习笔记3-对象的使用和定义

 

  1. 静态属性

  Object C中静态属性的定义和.NET中的有点不一样,先看看如下代码:

#import <Foundation/Foundation.h>
@interface Person : NSObject
{
    int age;
    NSString *name;
    static int totalCount;
    
}
@property int age;
@property NSString *name;

-(void) write;

+(void) hello;
@end
错误的static属性定义

  以上代码定义 static int totalCount; 这样在编译器中编译会报错,这样的代码编写对于编译器是不认可的。正确的定义放入如下:

#import <Foundation/Foundation.h>
@interface Person : NSObject
{
    int age;
    NSString *name;
}
@property int age;
@property NSString *name;

-(void) write;

+(void) hello;
@end
正确的static属性定义-interface
#import "Person.h"

static int count;

@implementation Person

@synthesize age;
@synthesize name;


-(void) write
{
    NSLog(@"姓名:%@  年龄:%i",name,age);
}

+(void) hello
{
    count++;
    NSLog(@"static = %i",count);
}


@end
正确的static属性定义-implementation

  static 属性应该定义在implementation中,而且写在implementation之外或者方法之中。以上代码是将static 属性写在implementation之外。

@autoreleasepool {
        for(int i=0;i<5;i++){
            [Person hello];
        }
    }


测试结果
2014-02-15 22:03:14.642 Object11[488:303] static = 1
2014-02-15 22:03:14.644 Object11[488:303] static = 2
2014-02-15 22:03:14.644 Object11[488:303] static = 3
2014-02-15 22:03:14.645 Object11[488:303] static = 4
2014-02-15 22:03:14.645 Object11[488:303] static = 5
测试代码和结果

  从以上代码可以看出,调用hello方法直接使用类名Person而非Person的实例,而且每次调用之后count都会+1.

 

  2. static属性在方法中

  修改代码如下,将static属性改到方法中。

#import "Person.h"



@implementation Person

@synthesize age;
@synthesize name;


-(void) write
{
    NSLog(@"姓名:%@  年龄:%i",name,age);
}

+(void) hello
{
    static int count;
    count++;
    NSLog(@"static = %i",count);
}
static 属性在方法中

  使用如上方式和1中的效果一样,static属性是属于类全局的,看看测试代码就知道效果如何:

@autoreleasepool {
        for(int i=0;i<5;i++){
            [Person hello];
        }
    }


//测试结果
2014-02-15 22:12:04.681 Object11[528:303] static = 1
2014-02-15 22:12:04.683 Object11[528:303] static = 2
2014-02-15 22:12:04.684 Object11[528:303] static = 3
2014-02-15 22:12:04.685 Object11[528:303] static = 4
2014-02-15 22:12:04.685 Object11[528:303] static = 5
测试代码和结果

  效果和前面的是一样的。下面再看看在实例方法中定义static 属性看看效果如下,修改代码如下:

#import "Person.h"



@implementation Person

@synthesize age;
@synthesize name;


-(void) write
{
    static int myage=0;
    myage++;
    NSLog(@"年龄:%i",myage);
}

+(void) hello
{
    static int count;
    count++;
    NSLog(@"static = %i",count);
}
在实例方法中定义static属性

  测试实例方法中的静态属性测试方法如下:

    @autoreleasepool {
        for(int i=0;i<5;i++){
            Person *p=[[Person alloc] init];
            p.name=[NSString stringWithFormat:@" %@ %i",@"object c",i];
            [p write];
        }
    }

//测试结果如下
2014-02-15 22:20:35.161 Object11[582:303] 姓名: object c 0  年龄:1
2014-02-15 22:20:35.163 Object11[582:303] 姓名: object c 1  年龄:2
2014-02-15 22:20:35.164 Object11[582:303] 姓名: object c 2  年龄:3
2014-02-15 22:20:35.164 Object11[582:303] 姓名: object c 3  年龄:4
2014-02-15 22:20:35.164 Object11[582:303] 姓名: object c 4  年龄:5
测试代码

  从以上测试代码可以看出,static 属性定义到实例方法中同样适用,在调用的循环过程中for不断实例化新的实例,name属性在发生变化,而count保留上次运行的结果,这也就是static的作用。

 

  3. 静态方法

  在.NET中定义静态方法也需要适用static 关键字,但是在Object C并非如此。在之前我们定义方法的时候都是如下格式:

  - (返回值类型) 方法名: 参数,... 

  适用静态方法 就是将 "-" 改为 "+" 即可。

  +(void) hello; 在interface中定义如上方法签名,而在implementation中实现这个方法。

  静态方法的时候在上面的例子中已经提到过了,可详细参考!

相关文章
|
10月前
java202303java学习笔记第二十五天-object之1
java202303java学习笔记第二十五天-object之1
35 0
|
10月前
java202303java学习笔记第二十五天-object之3
java202303java学习笔记第二十五天-object之3
25 0
java202303java学习笔记第二十五天-object之3
|
11月前
java202303java学习笔记第二十五天-object之3
java202303java学习笔记第二十五天-object之3
30 0
|
安全 Java 应用服务中间件
Distributed Object 2(三)|学习笔记
快速学习 Distributed Object 2(三)
101 0
Distributed Object 2(三)|学习笔记
|
前端开发 JavaScript Java
Distributed Object|学习笔记
快速学习 Distributed Object
93 0
Distributed Object|学习笔记
|
对象存储 开发者
对象存储 OSS 文件(Object)管理功能|学习笔记
快速学习对象存储 OSS 文件(Object)管理功能
372 0
|
Java 开发者
利用 Object 类解决重复操作|学习笔记
快速学习 利用 Object 类解决重复操作
|
Java API 开发者
什么时候使用 Object 接收 | 学习笔记
快速学习什么时候使用 Object 接收。
115 0
Object C学习笔记1-基本数据类型说明
  Objective-C数据类型可以分为:基本数据类型、对象类型和id类型。基本数据类型有:int、float、double和char类型。对象类型就是类或协议所声明的指针类型,例如:NSAutoreleasePool * pool,其中NSAutoreleasePool是一个类,NSAutoreleasePool *是它指针类型。
777 0
Object C学习笔记2-NSLog 格式化输出数据
  1 . 几种常用类型变量声明     int i =10;       BOOL isShow=YES;      BOOL isShow=1;       float f = 3.1415926;       char a =120;       NSString *name...
1150 0