面向对象编程总是离不开类和对象的,Objective-C也不例外,不过Objective-C中的类还有一些自己的独特点。

类的声明和定义

在iOS开发中,类的声明与定义通常都是分开的,类得声明通常存放在.h文件中,比如someclass.h文件,声明的内容要放在@interface和@end指令之间,这是接口部分,声明中主要是给出类的属性的名称和类型及方法的名称、参数和返回类型;而类的定义则通常放在同名的.m文件中,如someclass.m,定义的内容要放在@implementation和@end指令之间,这是实现部分,在类的定义文件中,需要在最开始导入声明文件,如#import "someclass.h",在定义文件中,主要是类的实现,比如方法的具体实现,实现存取器等。类的接口部分和实现部分都可以定义变量,区别是接口部分定义的变量是共有变量,子类可以直接访问,实现部分定义的变量是私有变量,子类不能直接访问,需要明确定义和合成取值方法,才能访问实例变量的值。
当然,这种文件分开的形式是推荐而不是必须的,在一个文件中,可以将类的声明放在@interface和@end指令之间然后将其定义放在@implementation和@end指令之间就可以了
在类的声明和定义中,通常需要导入一些系统文件,如基础的类库等,这时用#import <>就可以,比如#import <Foundation/Foundation.h>,这里区别于#import "",双引号是用于导入本地文件(开发者自己创建的文件),<>则用于引入系统文件。使用双引号时,编译器一般会首先在项目目录寻找指定文件,然后转到其他位置查找。
类的声明中,通常使用@property指令标识属性然后在实现部分使用@synthesize指令,就可以让编译器自动生成存取方法。如@property int somep;@ synthesize somep; 编译器就会自动生成两个方法:
-(int)somep;
-(void)setSomep:(int)somep;

static关键字

在变量声明之前加上static关键字,可以使局部变量保留多次调用一个方法所得的值,它只会在程序开始执行的时候初始化一次,在以后的多次调用中保存这些数值而不会重新初始化。它还具备以下特点:
(1)函数体内 static 变量的作用范围为该函数体,不同于 auto 变量,该变量的内存只被分配一次, 因此其值在下次调用时仍维持上次的值;
(2)在模块内的 static 全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问;
(3)在模块内的 static 函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明它的模块内;
(4)在类中的 static 成员变量属于整个类所拥有,对类的所有对象只有一份拷贝;
(5)在类中的 static 成员函数属于整个类所拥有,这个函数不接收 this 指针,因而只能访问类的static 成员变量。

类的方法的参数名是局部变量。执行方法时,通过方法传递的任何参数都被复制到局部变量中。因为方法使用参数的副本,所以不能改变通过方法传递的原值。

self关键字

self关键字是用来指明对象是当前方法的接收者。比如[self somefunc],就是在当前对象上调用了一个方法。

继承

当一个类继承自另一个类时,都会继承一些属性,比如父类的非私有实例变量和方法都会成为子类定义的一部分,子类可以直接访问这些方法和实例变量。子类中的同名方法会覆盖掉父类的同名方法,在子类的对象上调用该方法将会用子类的方法实现。类的继承方便了对其进行扩展,也可以通过分类机制(category)以模块的方式向现有类定义添加新方法,也就是说,不必经常给同一接口和实现文件增加新定义。当对没有源代码访问权限的类添加新定义时,特别方便。
在接口部分声明的实例变量才能被子类直接访问到,如
@interface someclass:NSObject
{
int x;
}

抽象类

有时,创建类只是为了更容易创建子类。因此,这些类名为抽象类或者抽象超类。在该类中定义方法和实例变量,但不期望任何人从该类创建实例。比如Foundation框架里的NSNumber类,它是为了将数字作为对象处理而创建的抽象类。整数与浮点数通常有不同得内存需求。每种数字类型都有单独的NSNumber子类,这些子类与它们的抽象超类不同,这些子类是具体存在的,它们名为具体子类。每个具体子类属于NSNumber类,总起来名为簇(cluster)。向NSNumber类发送消息来创建新的整数对象时,使用合适得子类为整数对象分配必要的空间,并正确地设定其值。这些子类实际上是私有的。你自己无法直接访问这些子类,只能通过抽象的超类间接访问。抽象超类提供了处理所有的数字对象类型的公共接口,你无须了解存储在数字对象中的数字类型及如何设置与检索该值。

iOS开发笔记系列-基础2(类)的更多相关文章

  1. iOS开发笔记系列-基础1(数据类型与表达式)

    学习iOS开发快两年了,去年完成MagViewer之后就因为公司的其他业务繁重,除了维护这个应用之外,只是断断续续地自己做一些实验开发,没有再发布新的应用,这里想整理一下学习过程中的笔记,以便加深印象 ...

  2. iOS开发笔记系列-基础5(分类和协议)

    分类 在Objective-C中,除了通过新建子类的方式来向类添加新方法外,还可以通过分类的方式.分类提供了一种简单的方式,将类的定义模块化到相关方法的组或分类中,它还提供了扩展现有类定义的简便方式, ...

  3. iOS开发笔记系列-基础3(多态、动态类型和动态绑定)

    多态:相同的名称,不同的类 使不同的类共享相同方法名称的能力成为多态.它让你可以开发一组类,这组类中的每一个类都能响应相同的方法名.每个类的定义都封装了响应特定方法所需要的代码,这使得它独立于其他的类 ...

  4. iOS开发笔记系列-基础6(预处理程序)

    预处理程序提供了一些工具,使用这些工具更易于开发.阅读.修改程序,也易于将程序移植到不同的系统中.又称为宏. #define #define语句的基本用途之一就是给富豪名称指定程序常量.比如: #de ...

  5. iOS开发笔记系列-基础4(变量与数据类型)

    对象的初始化 对象的初始化方法一般都如下: -(id)init { self=[super init]; if(self){ ... } return self; } 这个方法首先会调用父类的初始化方 ...

  6. iOS开发笔记系列-基础7(C语言特性)

    Objective-C是C语言的扩展,因此,也具备很多C语言的基本特性,这里只罗列部分. 块(Blocks) 块是对C语言的一种扩展,它并未作为标准ANSI C所定义的部分,而是Apple添加到语言中 ...

  7. IOS科研IOS开发笔记学习基础知识

    这篇文章是我的IOS学习笔记,他们是知识的基础,在这里,根据记录的查询后的条款. 1,UIScrollView能完毕滚动的功能. 示比例如以下: UIScrollView *tableScrollVi ...

  8. Java基础复习笔记系列 五 常用类

    Java基础复习笔记系列之 常用类 1.String类介绍. 首先看类所属的包:java.lang.String类. 再看它的构造方法: 2. String s1 = “hello”: String ...

  9. iOS开发技巧系列---详解KVC(我告诉你KVC的一切)

    KVC(Key-value coding)键值编码,单看这个名字可能不太好理解.其实翻译一下就很简单了,就是指iOS的开发中,可以允许开发者通过Key名直接访问对象的属性,或者给对象的属性赋值.而不需 ...

随机推荐

  1. 【HDOJ】1448 The Treasure

    这就是个简单的bfs.真没什么好说的,三维的状态就可以了.每次预处理一下monster的位置,然后再恢复. /* 1924 */ #include <iostream> #include ...

  2. Oracle EBS PO 收接事处理状态待定或错误

    PO接收后,发现在没有接收成功.在"事务处理状态汇总"查找到不是"待定"就是"错误",如下图:   对于事务处理状态"待定&quo ...

  3. Android开发之多线程下载、断点续传、进度条和文本显示

    代码实现了在Android环境下的多线程下载.断点续传.进度条显示和文本显示百分数: import java.io.BufferedReader; import java.io.File; impor ...

  4. C++中const小结

    1.const修饰普通变量(非指针变量)const修饰变量,一般有两种写法:const TYPE value;TYPE const value;对于一个非指针的类型TYPE,这两种写法在本质上是一样的 ...

  5. 测试darwin calendar 服务器

    cd CalDAVTester README.txt中说的明白—— QUICKSTART Edit the serverinfo.xml file to run the test against yo ...

  6. Innodb引擎 long semaphore waits

    上一篇介绍了因为子表过多,导致innodb crash的情况,但crash的原因是long semaphore waits.long semaphore waits又为何物? 背景:Innodb使用了 ...

  7. tyvj1519博彩游戏

    博彩游戏 From admin 背景 Background Bob最近迷上了一个博彩游戏…… 描述 Description 这个游戏的规则是这样的:每花一块钱可以得到一个随机数R,花上N块钱就可以得到 ...

  8. UVA 1324 The Largest Clique 最大团(强连通分量,变形)

    题意:给一个有向图,要求找出一些点,使得这些点中的任意点对,要么可以互通,要么单向可达. 思路:最低只要求单向可达即可,即a->b都可以算进去. 强连通分量内的点肯定是满足要求的,可以全选,但是 ...

  9. MyEclipse/Eclipse导入sun.misc.BASE64Encoder jar包步骤

    1.右键项目 -->Properties -->Java Bulid Path-> Libraries -->JRE System Library-->Access ru ...

  10. java中volatitle关键字的作用

    用在多线程,同步变量. 线程为了提高效率,将某成员变量(如A)拷贝了一份(如B),线程中对A的访问其实访问的是B.只在某些动作时才进行A和B的同步.因此存在A和B不一致 的情况.volatile就是用 ...