Objective-C 2.0增加了Class Extension用于解决两个问题:

  1. 可声明私有可读写的属性,而在类的声明中是同名的公开只读属性,从而来支持公开只读、私有可读写的属性
  2. 可声明私有方法;允许一个对象可以拥有一个私有的@interface,且可由编译器验证

公开只读、私有可写的属性(Publicly-Readable, Privately-Writeable Properties)

实现一个不可变(immutable)的数据结构通常有一个好处是外部代码不能用setter方法修改对象的状态。然而,可能又希望它在内部又是一个可写的属性。Extension可以做到这一点:

在类的扩展中声明一个属性为私有可读写,而在类的声明中定义的同名属性是公开只读的。这样,对外部代码而言,该属性将是只读的,而内部代码却可以使用它的setter方法。

私有方法(Private Method)

Objective-C 2.0以前,若要定义私有方法,通常是在实现文件中声明一个"Private" Category:

BaseClass+Private.h

 @interface BaseClass (Private) //类的分类
- (void)privateMethod; @end

然而,类的私用方法通常是希望存在于类的@implementation块中,而不是像上面的Category的方法那样存在于独立的@interface块中。事实上,Category仅仅是弥补了Objective-C缺少public/private限定的不足。

真正的问题是Objective-C编译器会认为在Category中声明的方法将会在别处实现,所以编译器并不会尝试确认它们是不是真的都被实现了。也就是说,开发者声明的方法有可能并未实现,而且编译器也不会有什么警告。编译会以为它们将在别的地方或独立的文件中实现。

使用Exteionsion,在其中声明的属性和方法的实现将放在Class的@implementation区块中。否则,编译器就会报错。

ExtensionClass.h

 @interface ExtensionClass : NSObject //类的声明
@property (retain, readonly) float value; //声明公开只读属性 @end

ExtensionClass.m

 @interface ExtensionClass() //类的扩展(Extension)
@property (retain, readwrite) float value; //1、声明私有可读写属性;而在类的声明中是同名的公开只读属性 - (void)privateMethod; //2、声明私有方法
@end @implementation ExtensionClass //类的实现 // 实现声明在头文件或父类中的公开方法,或者声明在扩展中的私有方法
- (void)privateMethod {
// implement private method here;
} @end

Extension和Category看起来相似,其实不同

由于Extension和Category的语法很相似,所以Extension常常被误解为一个匿名的Category,但是它们的目的和行为却是不同的。

Objective-C语法之扩展(Extension)的使用的更多相关文章

  1. 【iOS】Swift扩展extension和协议protocol

    加上几个关节前Playground摘要码进入github在,凝视写了非常多,主要是为了方便自己的未来可以Fanfankan. Swift语法的主要部分几乎相同的. 当然也有通用的.运算符重载.ARC. ...

  2. Objective-C分类 (category)和扩展(Extension)

    1.分类(category) 使用Object-C中的分类,是一种编译时的手段,允许我们通过给一个类添加方法来扩充它(但是通过category不能添加新的实例变量),并且我们不需要访问类中的代码就可以 ...

  3. Objective-C 类别(category)和扩展(Extension)

    1.类别(category) 使用Object-C中的分类,是一种编译时的手段,允许我们通过给一个类添加方法来扩充它(但是通过category不能添加新的实例变量),并且我们不需要访问类中的代码就可以 ...

  4. 分类(Category)的本质 及其与类扩展(Extension) /继承(Inherit)的区别

    1.分类的概念 分类是为了扩展系统类的方法而产生的一种方式,其作用就是在不修改原有类的基础上,为一个类扩展方法,最主要的是可以给系统类扩展我们自己定义的方法. 如何创建一个分类?↓↓ ()Cmd+N, ...

  5. iOS中 分类(category)与扩展(Extension)的区别?

    1.分类(category)的作用 (1).作用:可以在不修改原来类的基础上,为一个类扩展方法.(2).最主要的用法:给系统自带的类扩展方法. 2.分类中能写点啥? (1).分类中只能添加“方法”,不 ...

  6. 【转帖】PostgreSQL之 使用扩展Extension

    PostgreSQL之 使用扩展Extension https://www.cnblogs.com/lnlvinso/p/11042677.html 挺好的文章.自己之前没有系统学习过 扩展.. 目前 ...

  7. Swift2.1 语法指南——扩展

    原档:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programmi ...

  8. 基本语法 protocols Category extension

    转:http://blog.csdn.net/wangeen/article/details/16989529 protocol   本质就是一系列的method的声明,他并不像class是必须的选项 ...

  9. OC中分类(Category)和扩展(Extension)

    1.分类的定义 category是Objective-C 2.0之后添加的语言特性,中文也有人称之为分类.类别.Category的主要作用是为已经存在的类添加方法.这个大家可能用过很多,如自己给UIC ...

随机推荐

  1. 【WPF】软件更新程序的设计思路

    目标:客户端程序在启动时,自动联网检查服务端是否有新的版本,有则提示用户更新客户端. 思路: 1.打开Visual Studio,在主体程序的解决方案下再新建一个叫自动更新程序的项目.主体程序的目录是 ...

  2. [加密]ESP32 -Secure Boot 安全方案

    转自:https://blog.csdn.net/espressif/article/details/79362094 Secure Boot 功能概述 方案概述 Secure Boot 的目的是保证 ...

  3. [动态库]动态库生成和使用以及Makefile编写

    转自:https://www.cnblogs.com/ljtknowns/p/5647793.html 文件目录结构如下 1 dynamiclibapp.c 2 Makefile 3 comm/inc ...

  4. 基于opencv+Dlib的面部合成(Face Morph)

    引自:http://blog.csdn.net/wangxing233/article/details/51549880 零.前言 前段时间看到文章[1]和[2],大概了解了面部合成的基本原理.这两天 ...

  5. Swing获取字符串的宽度和高度

    import java.awt.Color; import java.awt.Font; import java.awt.font.FontRenderContext; import java.awt ...

  6. PropertyChangeSupport

    1 import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; /** * @author h ...

  7. 问题解决:bash: fork: retry: Resource temporarily unavailable

    linux报错: bash: fork: retry: Resource temporarily unavailable 不管是执行什么 登陆不了服务器The server refused to st ...

  8. 【oneday_onepage】——Growth Is A Bitch

    Companies are worth a multiple of their earnings and that multiple is directly related to earnings g ...

  9. 【html5】html5 本地存储

    最近一直在学习 html5,为了后期的移动项目进行知识储备.html5 相对于 html4 新增加了一些有趣的标签.属性和方法,今天主要介绍下 html5 的本地存储. 在客户端存储数据 html5 ...

  10. 关于 HTTP GET/POST 请求参数长度最大值的一个理解误区

    1.    Get方法长度限制 Http Get方法提交的数据大小长度并没有限制,HTTP协议规范没有对URL长度进行限制.这个限制是特定的浏览器及服务器对它的限制. 如:IE对URL长度的限制是20 ...