iOS开发笔记系列-基础4(变量与数据类型)
对象的初始化
对象的初始化方法一般都如下:
-(id)init
{
self=[super init];
if(self){
...
}
return self;
}
这个方法首先会调用父类的初始化方法,这使得继承的实例变量能够正常初始化。必须将父类init方法的执行结果赋值给self,因为初始化过程改变了对象在内存中的位置(意味着引用将要改变)。这里返回id类型,是编写可能会被继承的类的init方法的一般规则,因为子类的对象并不等同于父类,init的返回结果会通过子类的self=[super init]赋值给子类对象,所以不能硬编码返回类型。
作用域
实例变量的作用域只限于该类定义的实例方法,因此,任何实例方法都能直接通过变量名来访问该类的实例变量而无须进行特殊操作。
在接口中声明的实例变量可通过子类进行继承,继承来的实例变量同样可以通过变量名在该子类定义的方法中直接访问。
在接口部分声明实例变量时,可以通过以下指令来精确控制变量作用域:
@protected 指令后的实例变量可被该类及任何子类中定义的方法直接访问。(接口部分定义的实例变量默认就是这种作用域)
@private 指令后的实例变量只能被定义在该类的方法直接访问,子类中定义的方法不可以。(实现部分定义的实例变量默认是这种作用域)
@public 指令后的实例变量可被该类以及其他类或模块中定义的方法直接访问。
@package 对于64位映像,可在实现该类的映像中的任何地方访问这个实例变量。
全局变量
在程序的开始处(所有方法、类定义和函数定义之外)定义的变量,在模块(模块是指包含在一个源文件中任何数目的方法或者函数定义)中的任何位置都可以引用这个变量的值。确切地说,这不仅将该变量定义为全局变量,而且将其定义为外部全局变量。
外部变量是可被任何其他方法或函数访问和更改其值的变量。在需要访问外部变量的模块中,变量声明和普通方式一样,只是需要在声明前加上关键字extern。这就告知系统,要访问其他文件中定义的全局变量。
比如:
extern int gNum;
现在,包含前面这个声明的模块就可以访问和改变gNum的值。同样,通过在文件中使用类似的extern声明,其他模块也可以访问gNum的值。
使用外部变量时,必须遵循:变量必须定义在源文件中的某个位置。即在所有的方法和函数之外声明变量,并且前面不加关键字extern。如:
int gNum;
当然这里可以选择为这个变量赋初值,这就称为定义该变量了。
确定外部变量的第二种方式是在所有函数之外声明变量,在声明前加上extern,同时显示地指派初始值。如:
extern int gNum=;
这里可行,但不是推荐的。此时编译器会给出警告,提示你将变量声明为extern并同时为其赋值。这是因为使用关键字extern标明这条语句是变量的声明而不是定义。声明是不会分配变量的存储空间的,定义才会引起变量的存储空间分配。这里强行将声明当做定义处理,违背了这个规则。
处理外部变量时,变量可以在许多地方声明为extern,但是只能定义一次,具体示例如下:
//main.m
#import "Foo.h" int gGlobalVar=; int main (int argc, char *argc[])
{
Foo *myFoo = [[Foo alloc] init];
NSLog (@"%i", gGlobalVar);
[myFoo setgGlobalVar];
NSLog (@"%i", gGlobalVar);
return ;
} //Foo.m
-(void) setgGlobalVar
{
extern int gGlobalVar;
gGlobalVar=;
} //程序结果
可以在文件的开头统一进行一次extern声明,之后就可以在多个方法中访问这个变量了。
静态变量
外部变量与数据封装原则和面向对象编程技术是相违背的,更好地是将访问限制在setter和getter方法中,将实例变量隐藏起来。
如上所述,在方法之外定义的变量不仅是全局变量,也是外部变量。如果希望变量是全局而非外部,即在特定模块(文件)内全局,就需要使用关键字static。如果
static int gNum=;
声明在任何方法(或函数)之外,那么在该文件中,所有位于这条语句之后的方法或者函数都可以访问gNum的值,而其他文件中的方法和函数则不可以,这就是静态变量。
静态变量不是实例变量,这一点很重要,因为实例方法可以访问实例变量,而类方法是不能访问实例变量的,但是类方法可以访问静态变量。比如类的分配器方法,它要记录类已经分配空间的对象数目。设置一个静态变量,分配器方法就可以直接访问它,而类的用户并不知道这个变量,因为它是定义在实现文件中的静态变量,作用域是文件内部,因此,用户不能直接访问该变量,这也就不违背数据封装的概念,如果需要从类之外访问该变量,则可以编写一个方法来获取该变量的值。
枚举数据类型
Objective-C中可以将一系列值指派给一个变量,就是枚举类型。
定义:枚举类型的定义以关键字enum开头,之后是枚举数据类型得名称,然后是标识符序列(包括一对花括号),它们定义了可以给该类型指派的所有的允许值(理论如此,实际上如果指派其他值,编译器也不会警告)。例如:
enum flag {true,false}
声明:要声明一个enum flag类型得变量,仍需要用到关键字enum,之后是枚举类型名称,最后是变量序列,如:
enum flag Flag1, Flag2
能够指派给Flag1和Flag2的值只有true和false。
如果希望一个枚举类型标识符对应一个特定整数,可以在定义数据类型时给该标识符指定整数,列表中随后出现的枚举标识符被依次赋以整数值,从指定的整数值加1开始,如:
enum d {a,b,c=,d,e}
此时a=0,b=1,c=10,d=11,e=12。当然,枚举标识符可以用相同的整数值。
定义枚举类型时,也可以省略数据类型名称,如:
enum {east,west,south,north} direction
使用枚举数据类型时,尽量不要依赖枚举值被作为整数这个事实,而是把它们当做独立的数据类型。枚举类型提供了一种方法,使你能把整数值和有象征意义的名称对应起来。代码块中定义的枚举类型作用域限于块内部,程序的开始及所有块之外定义的枚举类型对于该文件是全局的。
枚举数据类型
Objective-C中允许为数据类型另外指派一个名称,通过typedef实现。如:
typedef int myInt;
//
myInt a,b; typedef Number *myNumber;
//
myNumber n1,n2;
要使用typedef定义一个新类型名,可以按如下步骤:
1)像声明所需类型的变量那样编写一条语句。如:int a;
2)在通常应该出现声明的变量名的地方,将其替换为新的类型名。如 int myInt;
3)在语句的前面加上关键字typedef。
iOS开发笔记系列-基础4(变量与数据类型)的更多相关文章
- iOS开发笔记系列-基础1(数据类型与表达式)
学习iOS开发快两年了,去年完成MagViewer之后就因为公司的其他业务繁重,除了维护这个应用之外,只是断断续续地自己做一些实验开发,没有再发布新的应用,这里想整理一下学习过程中的笔记,以便加深印象 ...
- iOS开发笔记系列-基础2(类)
面向对象编程总是离不开类和对象的,Objective-C也不例外,不过Objective-C中的类还有一些自己的独特点. 类的声明和定义 在iOS开发中,类的声明与定义通常都是分开的,类得声明通常存放 ...
- iOS开发笔记系列-基础6(预处理程序)
预处理程序提供了一些工具,使用这些工具更易于开发.阅读.修改程序,也易于将程序移植到不同的系统中.又称为宏. #define #define语句的基本用途之一就是给富豪名称指定程序常量.比如: #de ...
- iOS开发笔记系列-基础5(分类和协议)
分类 在Objective-C中,除了通过新建子类的方式来向类添加新方法外,还可以通过分类的方式.分类提供了一种简单的方式,将类的定义模块化到相关方法的组或分类中,它还提供了扩展现有类定义的简便方式, ...
- iOS开发笔记系列-基础7(C语言特性)
Objective-C是C语言的扩展,因此,也具备很多C语言的基本特性,这里只罗列部分. 块(Blocks) 块是对C语言的一种扩展,它并未作为标准ANSI C所定义的部分,而是Apple添加到语言中 ...
- iOS开发笔记系列-基础3(多态、动态类型和动态绑定)
多态:相同的名称,不同的类 使不同的类共享相同方法名称的能力成为多态.它让你可以开发一组类,这组类中的每一个类都能响应相同的方法名.每个类的定义都封装了响应特定方法所需要的代码,这使得它独立于其他的类 ...
- IOS科研IOS开发笔记学习基础知识
这篇文章是我的IOS学习笔记,他们是知识的基础,在这里,根据记录的查询后的条款. 1,UIScrollView能完毕滚动的功能. 示比例如以下: UIScrollView *tableScrollVi ...
- iOS开发技巧系列---详解KVC(我告诉你KVC的一切)
KVC(Key-value coding)键值编码,单看这个名字可能不太好理解.其实翻译一下就很简单了,就是指iOS的开发中,可以允许开发者通过Key名直接访问对象的属性,或者给对象的属性赋值.而不需 ...
- iOS开发笔记7:Text、UI交互细节、两个动画效果等
Text主要总结UILabel.UITextField.UITextView.UIMenuController以及UIWebView/WKWebView相关的一些问题. UI细节主要总结界面交互开发中 ...
随机推荐
- WINCE6.0+ILI9806E休眠唤醒显示异常问题
我们的系统WINCE6.0,它支持睡眠和唤醒,目的是想在不使用的时候让设备进入睡眠状态,降低功耗,我们遇到的问题就是设备正常启动后正常显示,但睡眠然后唤醒后要么显示白屏要么是条纹状白屏,如下图: 图1 ...
- 【HDOJ】4043 FXTZ II
1. 题目描述有n个球,第i个球的伤害值为$2^i-1, i \in [1,n]$.有甲乙两个人,每次由甲选择n个球中的一个,用它以相同概率攻击自己或者乙,同时彻底消耗这个球.这样的攻击最多进行n次. ...
- bzoj1453
这是一道好题,按行建线段树,每个点维护上下边界的连通性,详细见代码注释 网上写法不一,自认为比较简单,就放出来相出来献丑吧 ..,..] of longint; //u[]上边界,d[]下边界 s,f ...
- bzoj2245
这道题还是比较简单的费用流,由于w是递增的 实际上,这题数据还可以强一点,比如说分段函数不保证费用递增, 就要加一点技巧了(要保证函数的顺序) ; type node=record ne ...
- UVa 1606 (极角排序) Amphiphilic Carbon Molecules
如果,没有紫书上的翻译的话,我觉得我可能读不懂这道题.=_=|| 题意: 平面上有n个点,不是白点就是黑点.现在要放一条直线,使得直线一侧的白点与另一侧的黑点加起来数目最多.直线上的点可以看作位于直线 ...
- Can not perform pod install under el capitan (15A279b)
这个问题在stackoverflow上面有过讨论: Can not perform pod install under el capitan (15A279b) 被采纳的答案为:sudo gem in ...
- Entity Framework 数据生成选项DatabaseGenerated
在EF中,我们建立数据模型的时候,可以给属性配置数据生成选项DatabaseGenerated,它后有三个枚举值:Identity.None和Computed. Identity:自增长 None:不 ...
- 用Apache Kafka构建流数据平台
近来,有许多关于“流处理”和“事件数据”的讨论,它们往往都与像Kafka.Storm或Samza这样的技术相关.但并不是每个人都知道如何将这种技术引入他们自己的技术栈.于是,Confluent联合创始 ...
- Android Activity四种加载方式
Android之四种加载方式 (http://marshal.easymorse.com/archives/2950 图片) 在多Activity开发中,有可能是自己应用之间的Activity跳转,或 ...
- bzoj 1058 [ZJOI2007]报表统计(set)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1058 [题意] 一个序列,提供插入,查询相邻最小差值,查询任意最小差值的操作. [思路 ...