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=;i<;i++){
[Person hello];
}
}
测试结果
-- ::14.642 Object11[:] static =
-- ::14.644 Object11[:] static =
-- ::14.644 Object11[:] static =
-- ::14.645 Object11[:] static =
-- ::14.645 Object11[:] static =
测试代码和结果
从以上代码可以看出,调用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=;i<;i++){
[Person hello];
}
}
//测试结果
-- ::04.681 Object11[:] static =
-- ::04.683 Object11[:] static =
-- ::04.684 Object11[:] static =
-- ::04.685 Object11[:] static =
-- ::04.685 Object11[:] static =
测试代码和结果
效果和前面的是一样的。下面再看看在实例方法中定义static 属性看看效果如下,修改代码如下:
#import "Person.h" @implementation Person @synthesize age;
@synthesize name; -(void) write
{
static int myage=;
myage++;
NSLog(@"年龄:%i",myage);
} +(void) hello
{
static int count;
count++;
NSLog(@"static = %i",count);
}
在实例方法中定义static属性
测试实例方法中的静态属性测试方法如下:
@autoreleasepool {
for(int i=;i<;i++){
Person *p=[[Person alloc] init];
p.name=[NSString stringWithFormat:@" %@ %i",@"object c",i];
[p write];
}
}
//测试结果如下
-- ::35.161 Object11[:] 姓名: object c 年龄:
-- ::35.163 Object11[:] 姓名: object c 年龄:
-- ::35.164 Object11[:] 姓名: object c 年龄:
-- ::35.164 Object11[:] 姓名: object c 年龄:
-- ::35.164 Object11[:] 姓名: object c 年龄:
测试代码
从以上测试代码可以看出,static 属性定义到实例方法中同样适用,在调用的循环过程中for不断实例化新的实例,name属性在发生变化,而count保留上次运行的结果,这也就是static的作用。
3. 静态方法
在.NET中定义静态方法也需要适用static 关键字,但是在Object C并非如此。在之前我们定义方法的时候都是如下格式:
- (返回值类型) 方法名: 参数,...
适用静态方法 就是将 "-" 改为 "+" 即可。
+(void) hello; 在interface中定义如上方法签名,而在implementation中实现这个方法。
静态方法的时候在上面的例子中已经提到过了,可详细参考!
Object C学习笔记10-静态方法和静态属性的更多相关文章
- Vue2.x源码学习笔记-Vue静态方法和静态属性整理
Vue静态方法和静态属性,其实直接在浏览器中可以查看到的,如下 圈起来的是其静态属性,但是有的属性对象中的属性的值又是函数.未圈起来的则是函数. 其实它来自如下各个目录下的js文件 // src/co ...
- Object C学习笔记24-关键字总结
学习Object C也有段时间了,学习的过程中涉及到了很多Object C中的关键字,本文总结一下所涉及到的关键字以及基本语法. 1. #import #import <> 从syste ...
- Object C学习笔记24-关键字总结(转)
学习Object C也有段时间了,学习的过程中涉及到了很多Object C中的关键字,本文总结一下所涉及到的关键字以及基本语法. 1. #import #import <> 从syste ...
- Object C学习笔记17-动态判断和选择器
当时学习Object C的时被人鄙视了一顿,说使用.NET的思想来学Object C就是狗屎:不过也挺感谢这位仁兄的,这让我学习的时候更加的谨慎.今天的学习笔记主要记录Object C中的动态类型相关 ...
- thinkphp学习笔记10—看不懂的路由规则
原文:thinkphp学习笔记10-看不懂的路由规则 路由这部分貌似在实际工作中没有怎么设计过,只是在用默认的设置,在手册里面看到部分,艰涩难懂. 1.路由定义 要使用路由功能需要支持PATH_INF ...
- 并发编程学习笔记(10)----并发工具类CyclicBarrier、Semaphore和Exchanger类的使用和原理
在jdk中,为并发编程提供了CyclicBarrier(栅栏),CountDownLatch(闭锁),Semaphore(信号量),Exchanger(数据交换)等工具类,我们在前面的学习中已经学习并 ...
- Spring 源码学习笔记10——Spring AOP
Spring 源码学习笔记10--Spring AOP 参考书籍<Spring技术内幕>Spring AOP的实现章节 书有点老,但是里面一些概念还是总结比较到位 源码基于Spring-a ...
- Object C学习笔记22-#define 用法
上一篇讲到了typedef 关键字的使用,可以参考文章 Object C 学习笔记--typedef用法 .而在c中还有另外一个很重要的关键字#define. 一. #define 简介 在C中利用预 ...
- Object C学习笔记21-typedef用法
在上一章的学习过程中遇到了一个关键字typedef,这个关键字是C语言中的关键字,因为Object C是C的扩展同样也是支持typedef的. 一. 基本作用 typedef是C中的关键字,它的主要作 ...
随机推荐
- python-面向过程编程
面向过程: 核心是过程.过程指的是解决问题的步骤,设计一条流水线,机械式的思维方式. 优点:复杂的问题流程化,进而简单化
- 发现微信支付bug
第一张银行卡支付金额不足无法付款,选择另一张同样密码的银行卡,居然不用重新输入密码即可直接付款成功!
- 推荐一个好用的以多tab标签方式打开windows CMD的工具
最近我在做基于nodejs的微服务开发,需要在windows命令行里启动很多微服务.我的windows 10任务栏是这样子的: 我想找一款能像下图Chrome标签页这样打开windows 10 CMD ...
- 利用xlst导出多表头的简便方法
大家都知道在ASP.NET中进行表格导出有很多种办法,aspose,npoi,cvs等等,今天就来介绍xlst,导出多表头.与以往不一样的是我们利用模板,只需要在模板中定义好表格样式,然后绑定数据就可 ...
- MVC四大筛选器—AuthorizeFilter
在Action的执行中包括两个重要的部分,一个是Action方法本身逻辑代码的执行,第二个就是Action方法的筛选器的执行. MVC4中筛选器都是以AOP(面向方面编程)的方式来设计的,通过对Act ...
- 4-2 R语言函数 apply
#apply函数,沿着数组的某一维度处理数据 #例如将函数用于矩阵的行或列 #与for/while循环的效率相似,但只用一句话可以完成 #apply(参数):apply(数组,维度,函数/函数名) & ...
- 1034. [ZJOI2008]泡泡堂【贪心】
Description 第XXXX届NOI期间,为了加强各省选手之间的交流,组委会决定组织一场省际电子竞技大赛,每一个省的代表 队由n名选手组成,比赛的项目是老少咸宜的网络游戏泡泡堂.每一场比赛前,对 ...
- [BJWC2011]最小三角形
嘟嘟嘟 这一看就是平面分治的题,所以就想办法往这上面去靠. 关键就是到\(mid\)点的限制距离是什么.就是对于当前区间,所有小于这个距离的点都选出来,参与更新最优解. 假设从左右区间中得到的最优解是 ...
- 20145203盖泽双 《Java程序设计》第8周学习总结
20145203盖泽双 <Java程序设计>第8周学习总结 教材学习内容总结 1.java.util.logging包提供了日志功能相关类与接口,使用日志的起点是logger类,Logge ...
- ls: Call From hdoop2/192.168.18.87 to hdoop2:8020 failed on connection exception: java.net.ConnectException: 拒绝连接; For more details see
场景: 预发环境中,同事已经搭建了一套hadoop集群,由于版本与所需不符,所以需要替换版本 问题描述: 在配置文件都准确的情况下,启动hadoop,出现以下报错: 启动之前初始化: 初始化目录 ...