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. Web基础 HTML CSS JS JQuery AJAX

    1. Web基础 网页的骨骼HTML 什么是HTML超文本标记语言:Hyper Text Markup Language 这都不重要,重要的是:HTML是Web网页的基本组成部分HTML中定义的元素, ...

  2. java框架篇---struts之OGNL详解

    OGNL(Object Graph Navigation Language),是一种表达式语言.使用这种表达式语言,你可以通过某种表达式语法,存取Java对象树中的任意属性.调用Java对象树的方法. ...

  3. Bootstrap+Angularjs自制弹框

    指令 directive('bsPopup', function ($parse) { return { require: 'ngModel', restrict: 'A', link: functi ...

  4. [notes] some code tips

    genericizing-codehtml, body {overflow-x: initial !important;}html { font-size: 14px; } body { margin ...

  5. MongoDB不支持批量插入

    mongodb的结构与关系型数据库不同,它类似树状结构,可以很方便对每个分支进行操作,但它没有像mysql那样insert(value.value.value...)那样的语法,也不支持transac ...

  6. Go Revel - Filter(过滤器)源码分析

    在 Go Revel - server.go 源码分析 http://www.cnblogs.com/hangxin1940/p/3265538.html 说到revel框架很多重要的东西都Filte ...

  7. VS2013安装MVC5

    打开VS 选择  .net 4.5 创建项目 右击项目 选择管理NuGet 输入Microsoft.AspNet.Mvc -Version 5.0.0 安装最新版本的MVC5

  8. Redis Java连接操作

    安装 要在Java程序中使用使用操作Redis,需要确保有Redis的Java驱动程序和Java设置在机器上.可以检查看Java教程-学习如何在机器上安装Java.现在,让我们来看看如何设置Redis ...

  9. MVC教程九:异常过滤器

    我们平常在程序里面为了捕获异常,会加上try-catch-finally代码,但是这样会使得程序代码看起来很庞大,在MVC中我们可以使用异常过滤器来捕获程序中的异常,如下图所示: 使用了异常过滤器以后 ...

  10. Struts 2应用程序安全功能的配置详解

    安全性是Web应用程序开发工作中最关键的问题之一.在基于servlet的应用程序里,保护应用程序资源的办法有两种:一是对应用程序进行配置(web.xml),二是使用Java代码硬编码到程序中.前一种方 ...