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细节主要总结界面交互开发中 ...
随机推荐
- POJ 1149 PIGS ★(经典网络流构图)
[题意] 有M个猪圈,每个猪圈里初始时有若干头猪.一开始所有猪圈都是关闭的.依 次来了N个顾客,每个顾客分别会打开指定的几个猪圈,从中买若干头猪.每 个顾客分别都有他能够买的数量的上限.每个顾客走后, ...
- 优秀it博客和文章
优秀博客 综合 杨文博(供职于百度公司,任复合搜索部资深研发工程师,目前作为tech lead,负责垂直行业搜索后端架构研发.) 杨远骋 徐宥(Google 软件工程师. 这个中文博客是我的思考记录, ...
- Swift不可变数组
Objective-C编写了2个不同的类来区分不可变数组(NSArray)和可变数组(NSMutableArray): Swift通过使用常量和变量来区分不可变数组和可变数组. 只要将数组定义为常量, ...
- Apache-AB压力测试实例
一 AB背景介绍 Apache附带的压力测试工具apache bench--简称ab,非常容易使用,并且完全可以摸你各种条件对Web服务器发起测试请求.ab可以直接在Web服务器本地发起测试请求,这对 ...
- Stm32外围模块编程初始化步骤
Stm32外围模块编程初始化步骤: 一.外部中断 1)初始化 IO 口为输入. 这一步设置你要作为外部中断输入的 IO 口的状态,可以设置为上拉/下拉输入,也可以设置为浮空输入,但浮空的时候外部一定要 ...
- Tomcat 7 Connector 精读(2) CoyoteAdapter
这个适配器类只讲2个方法,构造方法中我们看到一个适配器对象有自己关联的连接器类. 其中Service的重要任务就是讲客户端端请求交给容器. public void service(org.apache ...
- Solaris10下Telnet、SSH、ftp使用root登录
学习solaris过程中,使用SecureCRT.putty等工具用root账号登录,总是登录不上去,后来经老师解答和网上找答案,发现是 solaris默认是不可以远程使用root账号登录的,如果想开 ...
- pollard_rho和Miller_Rabin
Miller_Rabin就是以概论大小来判断素数 可以判断2^63范围的数 pollard_rho推荐两个很好的博客来理解:整数分解费马方法以及Pollard rho和[ZZ]Pollard Rho算 ...
- linux命令getopts
一.getopts 简介 由于shell命令行的灵活性,自己编写代码判断时,复杂度会比较高.使用内部命令 getopts 可以很方便地处理命令行参数.一般格式为: getopts options va ...
- 让浏览器进行跨域访问, 开发阶段需要跨域访问的测试方案 chrome的快捷方式里面 加 "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --args --disable-web-security
Chrome浏览器 的快捷方式里加一个 命令可以使浏览器进行跨域访问 "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe ...