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细节主要总结界面交互开发中 ...
随机推荐
- C#中string.Format()和ToString()格式化方法
C#数字格式化输出是我们在编程中经常需要处理的事情,那么这里向你介绍了一些C#数字格式化输出的例子,这样就会方便你来选择和比较,什么方式是比较适合自己项目的. int a = 12345678; C# ...
- Poj2948Martian Mining(记忆化)
链接 这题意好难懂 看得迷迷糊糊 想的也迷迷糊糊 后来睡了会突然想到了..不就是类似以前的矩阵操作 从右下角记忆化 大的由小的推来 dp[i][j] = max(dp[i-1][j]+s1,dp ...
- poj 2409 Let it Bead && poj 1286 Necklace of Beads(Polya定理)
题目:http://poj.org/problem?id=2409 题意:用k种不同的颜色给长度为n的项链染色 网上大神的题解: 1.旋转置换:一个有n个旋转置换,依次为旋转0,1,2,```n-1. ...
- a标签中的label在IE下触发不了a标签的href链接(label标签——解析)
<a href="http://www.baidu.com/" target="_blank"> <span>百度</span&g ...
- Spring注释@Qualifier
在学习@Autowired的时候我们已经接触到了@Qualifier, 这节就来详细学习一下自定义@Qualifier. 例如定义一个交通工具类:Vehicle,以及它的子类Bus和Sedan. 如果 ...
- Codeforces 633 C Spy Syndrome 2 字典树
题意:还是比较好理解 分析:把每个单词反转,建字典树,然后暴力匹配加密串 注:然后我就是特别不理解,上面那种能过,而且时间很短,但是我想反之亦然啊 我一开始写的是,把加密串进行反转,然后单词正着建字典 ...
- 一个简单的appium脚本
这是一个简单的appium脚本,测试amazon购物过程的,过程包括搜索商品,然后从结果列表中选取中意的商品,然后加入购物车,等等. 它是一个最原始的脚本,对测试元素.数据.报告等未作任何的封装,后面 ...
- 洛谷 P1373 小a和uim之大逃离
2016-05-30 12:31:59 题目链接: P1373 小a和uim之大逃离 题目大意: 一个N*M的带权矩阵,以任意起点开始向右或者向下走,使得奇数步所得权值和与偶数步所得权值和关于K的余数 ...
- socket.io使用随笔
这段时间一直在做一个手机APP,正好使用到了socket.io.这里记录一下服务器端发送信息的几种不同方式: socket.emit('message',"this is a test&qu ...
- 第十三章、学习 Shell Scripts 循环 (loop)
while do done, until do done (不定循环) while [ condition ] <==中括号内的状态就是判断式 do <==do 是回圈的开始! 程序段落 ...