面向对象编程总是离不开类和对象的,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. Codeforces Round #224 (Div. 2)

    题目:http://codeforces.com/contest/382 A Ksenia and Pan Scales 一个求天平是否能够平衡的题目...水题,注意一下结果的输出就行. #inclu ...

  2. (转载)有关反演和gcd

    tips : 积性函数 F (n) = Π F (piai ) 若F (n), G (n)是积性函数则 F (n) * G (n) Σd | n F (n) 是积性函数 n = Σd | n  φ ( ...

  3. POJ 1149 PIGS ★(经典网络流构图)

    [题意] 有M个猪圈,每个猪圈里初始时有若干头猪.一开始所有猪圈都是关闭的.依 次来了N个顾客,每个顾客分别会打开指定的几个猪圈,从中买若干头猪.每 个顾客分别都有他能够买的数量的上限.每个顾客走后, ...

  4. apache开源项目--TIKA

    Tika是一个内容抽取的工具集合(a toolkit for text extracting).它集成了POI, Pdfbox 并且为文本抽取工作提供了一个统一的界面.其次,Tika也提供了便利的扩展 ...

  5. 学习Erlang--1、入门

    1.正式起航 从前,一名程序员偶然读到了一本古怪的语言图书,相等其实不是相等,变量其实是不能改变的,语法是那么陌生,它甚至不是面向对象,这些程序实在是太过另类…… 另类的不仅仅是程序,编程的教学步骤也 ...

  6. PHP错误:Forbidden You don't have permission to access / on this server.

    今天在测试一个php程序的时候,发现这个问题: Forbidden You don't have permission to access / on this server. 开始的时候我是用http ...

  7. 什么是MBeanServer

    什么是MBeanServer MBeanServer是一个包含所有注册MBean的仓库.它是JMX代理层的核心.JMX1.0规范提供一个接口叫 javax.management.MBeanServer ...

  8. 单元测试工具之Xunit

    在.NET开发中的单元测试工具之——xUnit.Net  原始出处 http://zhoufoxcn.blog.51cto.com/792419/1172320 在上一篇<在.NET开发中的单元 ...

  9. PHP 通用检测函数集

    // ※CheckMoney($C_Money) 检查数据是否是99999.99格式 // ※CheckEmailAddr($C_mailaddr) 判断是否为有效邮件地址 // ※CheckWebA ...

  10. 网页推送库 SignalR

    SignalR 可以用这个库开发网页聊天室应用 ASP.NET SignalR 是为 ASP.NET 开发人员提供的一个库,可以简化开发人员将实时 Web 功能添加到应用程序的过程.实时 Web 功能 ...