《精通Objective-C》笔记 第二章 16.3.21

----------------------------------------------------------------------------------------------------------------------------------------------------------------

《第二章:使用类》


类是面向对象程序设计(OOP)的构建块。十几上,通过OOP编写的程序主要由相互作用的类实例(即对象)的网络构成。


2.1类

面向对象编程是一种计算机程序的设计方式,其重点是创建和使用软件对象编写程序。软件对象提供了被建模事物/概念的特点或属性的一种表现形式(他们的状态),以及他们可以做的事情的定义(他们的方法)。

在使用OC时,可以为拥有类接口 和对应实现的对象,创建规范和蓝图。 在接口中,可以设置类的结构(属性和方法)。在实现时,可以设置存储类的内部状态变量,还可以通过定义类的属性和方法实现其逻辑。


类的接口是在头文件.h中设置的,而由.m文件实现。

类接口的声明以@interface指令开头,后跟类的名称,以@end指令结束。


2.2实例变量

实例变量是指为类声明的变量,他们在相应类实例(即对象)的生命周期中存在并拥有值。 当对象被创建时,系统会为实例变量分配内存,当对象被释放时系统也会释放变量占用的内存。 实例变量拥有与对象对应的作用范围和命名空间。 OC提供了控制实例变量直接方位方式的特性,还提供了获取和设置他们的值得方便机制。


设置访问实例变量的方式: 访问对象的实例变量的方式属于对象功能范畴,在对象内部,对象的任何实例方法都可以访问该对象的实例变量。

    通过外部类实例直接访问对象的实例变量属于变量功能范畴。

@private:将实例变量设置为只能在声明他的类以及与该类类型相同的其他实例变量中访问。(私有变量)

@protected:将实例变量设置为智能在声明他的类及其子类的实力方法中被访问。,在没有明确设置实例变量的访问控制等级时,这是默认等级。

@public:将实例变量设置为可以被任何代码访问。

@package: 将实例变量设置为可以被其他类实例和函数访问,但是在其所属程序包的外部,他会被视为私有变量。这种作用范围可以用于库或框架。


尽管使用实例变量可以方便、直接地访问对象的状态,但是这会暴露类的内部,因而会违反OOP的防撞原则。因此,只应在必要时声明实例变量,而且应将这些代码放在类的实现部分,而不是公有接口中。  更好的公开对象内部状态的方式是使用自动声明属性。


2.3  属性

在许多程序设计语言中,获取对象内部状态的方法(getter setter方法)必须手动编写。 OC中提供了简化和自动化该任务的自动声明属性。属性与实例变量的区别是,属性无法直接访问对象的内部状态,但提供了访问这类数据的方便机制(即读取和设置方法),因而可以含有其他逻辑。

通过OC的自动声明属性,编译器能共根据你提供的规范自动生成这些方法,这减少了编写和维护代码的工作量,并能够增加程序的一致性和可靠性。


属性的特性:  使用属性的声明特性可以设置属性的存储语义和其他行为。常用如下:

类别 特性 描述

原子性 nonatomic使用该特性可以在多线程并发的情况中,将访问器设置为非原子性的,因而能够提供不同的结果。因而能够提供不同的结果。如果不设置该特性,访问器就会拥有原子性,换言之,赋值和返回结果永远都会完全同步

设置器语义 assign 通过该特性可以在不适用copy和retain特性的情况下,使属性的设置器方法执行简单的赋值操作。这个特性是默认设置。
设置器语义 retain 在赋值时,输入值会被发送一条保留信息,而上一个值会被发送一条释放消息。
设置器语义 copy 在赋值时,输入值会被发送一条新消息的副本,而上一个值会被发送一条释放消息
设置器语义 strong 当使用ARC内存管理功能时,该特性等同于retain。
设置器语义 weak 当使用ARC内存管理功能时,该特性的作用与assign类似,但如果引用对象被释放,属性的值会被设置为nil
可读写性 readwrite 使用该特性时,属性可以被读取也可以被写入,而且必须实现getter和setter方法,这个特性是默认设置。
可读写性 read-only 使用该特性时,会将属性设置为只读。必须实现getter方法。
方法名称 getter=getterName 将getter方法命名为新读取器名称
方法名称 setter=setterName 将setter方法命名为新读取器名称


访问属性:
OC有两种访问属性的机制:访问器方法和点语法。       一般情况下,你应该使用这两种机制访问属性。然而,如果与属性关联的对象还没有完全的建好,就不要使用这些机制, 而应该使用支持属性的实例变量。



2.4方法

方法定义了类和类实例(对象)在运行时展示的行为。他们直接与OC类(类方法)或对象(实例方法)关联。


语法:
方法的声明由方法类型、返回值类型和一个或多个(提供名称、阐述和参数类型信息的)方法代码段构成,如下:
+(id)hydrogenWithProtons:(unsigned)np  neutrons:  (unsigned) nn

+                  (id)                             hydrogenWithProtons:(unsigned)np    neutrons:         (unsigned)nn
方法类型     返回值类型 方法段名称                 参数类型          方法段名称    参数类型
+类方法
-实例方法



调用方法:
[接收器  方法代码段的名称: 参数值   ...]      多个代码段用空格分隔  如:
[Atom  withProtons:6  neutrons:6   electrons:6]




2.5协议

使用协议声明的方法和属性可以由任何类实现。
类接口直接与特定的类关联,因此也会直接与类的层次结构关联。相对而言,协议不与特定的类关联,因此使用它可以捕捉无继承关系的类之间的相似之处。
协议使OC支持多重继承规范的概念(方法声明)。
协议还可以用于定义对象能够发送哪些消息(通过设置遵守协议的属性)。


语法:
协议的声明以@protocol指令开头,后跟协议的名称,以@end指令结束。
协议拥有必选方法和可选方法。可选方法不是协议必须实现的方法。
使用@required(必选)和@optional(可选)可以标记。  如果没有使用这些关键字,默认设置为必选方法。

如:
@protocol 协议名称
//属性名称
@required
//方法声明
@optional
//方法声明
@end

通过在尖括号中设置已声明协议的名称,可以使一个协议与其他协议合并——这称为接受协议。可以使用逗号分隔多个协议。
@protocol  协议名称 <协议名称>
//方法名称
@end

使接口接受其他协议:
@interface  类的名称  :  父类的名称 <协议名称>
//方法声明
@end


2.6  分类

使用分类可以在不进行子类话的情况下,为已经存在的类增加功能。分类中的方法会成为类的组成部分(在程序中),并且会被其子类继承。
分类常用于:   1.扩展其他人定义的类(即使你无法访问其源代码)    2.替代子类    3.将林雷的实现代码分发给多个源文件(通过多人分工简化大型类的开发工作)

语法:
@interface  类的名称  (分类的名称)
//方法声明
@end




扩展:
可以将扩展视为一种匿名分类。在扩展中声明的方法必须在相应类的@implementation中实现(他们无法在分类中实现)  其语法如下:
@interface 类的名称  ()
{
//实例变量的声明
}
// 属性的声明
//方法的声明
@end

扩展与分类的区别是他能够声明实例变量和属性。编译器会检查在扩展中声明的方法(和属性)是否被实现。
类扩展通常应存储在实现文件中,并用于组织和声明在类中独立使用的其他私有方法(例如,不是公用API的一部分)





















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值