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

  在.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中实现这个方法。

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

时间: 2024-10-22 17:30:17

Object C学习笔记10-静态方法和静态属性的相关文章

thinkphp学习笔记10—看不懂的路由规则

原文:thinkphp学习笔记10-看不懂的路由规则 路由这部分貌似在实际工作中没有怎么设计过,只是在用默认的设置,在手册里面看到部分,艰涩难懂.   1.路由定义 要使用路由功能需要支持PATH_INFO,PATH_INFO是什么呢?手册中提到"要使用路由功能,前提是你的URL支持PATH_INFO(或者兼容URL模式也可以,采用普通URL模式的情况下不支持路由功能)," , url支持path_info,不是apache要支持path_info么,度娘讲的还算清楚一点,见下文: p

Object C学习笔记17-动态判断和选择器

当时学习Object C的时被人鄙视了一顿,说使用.NET的思想来学Object C就是狗屎:不过也挺感谢这位仁兄的,这让我学习的时候更加的谨慎.今天的学习笔记主要记录Object C中的动态类型相关内容. 首先还是和.NET先对比一下,.NET中存在一个关键字var ,这个估计用过.NET的都知道,除非没有接触过3.0以上版本的.在.NET中能够使用var来声明任何类型的局部变量,负责告诉编译器,该变量需要根据初始化表达式来推断变量的类型,而且只能是局部变量.但是这里要注意的时var 并不是一

Object C学习笔记21-typedef用法

在上一章的学习过程中遇到了一个关键字typedef,这个关键字是C语言中的关键字,因为Object C是C的扩展同样也是支持typedef的. 一. 基本作用 typedef是C中的关键字,它的主要作用是给一个数据类型定义一个新的名称,这些类型报告内部数据类型,比如int,char 还有自定义类型struct,enum等. typedef一般有两个作用:(1) 给某种类型顶一个定义比较容易记的名字,相当于别名;(2)简化较为复杂的类型声明.   二. typedef的使用 1. 定义新类型 语法

php函数、类和对象以及类的封装、继承、类的静态方法、静态属性

原文:php函数.类和对象以及类的封装.继承.类的静态方法.静态属性 1.函数     php内置函数可以直接使用,如果没有安装php扩展即可     自定义函数 //函数function 函数名 function dump($var = null){ //支出默认参数值 echo '<pre/>'; var_dump($var); } 2.类(class)和对象( new Obj) <?php //定义一个人的类,现在还不是对象 class Person { //私有属性 privat

从JVM内存管理的角度谈谈JAVA类的静态方法和静态属性

在JVM中,内存分为两个部分,Stack(栈)和Heap(堆),这里,我们从JVM的内存管理原理的角度来认识Stack和Heap,并通过这些原理认清Java中静态方法和静态属性的问题. 一般,JVM的内存分为两部分:Stack和Heap.(stack和heap都是位于RAM中的) stack(栈)是JVM的内存指令区.stack管理很简单,push一定长度字节的数据或者指令,stack指针压栈相应的字节位移:pop一定字节长度数据或者指令,stack指针弹栈.stack的速度很快,管理很简单,并

spring学习笔记(10)@AspectJ研磨分析[1]入门、注解基本介绍

@AspectJ准备 AspectJ是一个面向切面的框架,它扩展了Java语言.AspectJ定义了AOP语法所以它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件. 在使用AspectJ之前,我们需要导入aspectJ相应的jar包,可到我的资源页http://download.csdn.net/detail/qwe6112071/9468329 中下载,而如果使用maven则可直接在pom.xml中加入如下代码: <dependency> <groupId>o

Object C学习笔记15-协议(protocol)

在.NET中有接口的概念,接口主要用于定义规范,定义一个接口关键字使用interface.而在Object C 中@interface是用于定义一个类的,这个和.NET中有点差别.在Object C中有一个协议(protocol) 的概念,这个和.NET中的interface类似. 协议(Protocol) 在列出的方法在本类中并没有相应实现,而是别的类来实现这些方法,而定义协议必须使用protocol关键字.   一. 如何定义protocol的定义 如何使用XCode新建一个协议.h 文件

API Demos 2.3 学习笔记 (10)-- Views-&amp;gt;WebView

更多精彩内容,请点击阅读:<API Demos 2.3 学习笔记> WebView是一个专门用来显示网页的View子类.它使用WebKit渲染引擎来显示网页,并且支持包括前进,后退,放大,缩小,文本搜索等多种功能. WebView有一个辅助类叫WebSettings,它管理WebView的设置状态.该类的对象可以通过WebView.getSettings()方法获得.下面我们介绍几个常用的WebSettings设置: //得到WebView对象 WebView mWebView = (WebV

Object C学习笔记8-字符串NSString之二

5. 字符串是否包含 hasPrefix 判断字符串是否以某个字符串开头 hasSuffix 判断字符串是否以某个字符串结尾 NSString *str1=@"Object C学习正在进行中.... LOVE"; if([str1 hasPrefix:@"Object"]){ NSLog(@"字符串:%@是以%@开头",str1,@"Object"); } if([str1 hasSuffix:@"LOVE"