类别和扩展

类别

使用类别可以扩展类的功能,不管该类的源码是否存在都可以扩展,和继承的最大不同就是类别中的方法可以访问被扩展类的私有元素。

  • 类别的命名通常使用"类+类别名"的形式,如 Person+PersonLife.h
  • 类可以有多个类别。
  • 类别会覆盖方法,如果类的方法和类别的方法冲突,则会调用类别的方法
  • 类别可以访问私有元素,继承并不可以。
  • 类别不能定义属性

类别的定义如下

  1. #import "Person.h"
  2. @interface Person(PersonLife)
  3. @end
  4. @implementation Person(PersonLife)
  5. @end

使用类别

使用的时候导入 #import "Person+PersonLife"

  1. #import "Person+PersonLife.h"
  2. int main(int argc, const char * argv[])
  3. {
  4. @autoreleasepool {
  5. Person *p = [[Person alloc] init];
  6. }
  7. return 0;
  8. }

类扩展

类扩展是一种特殊的类别,在声明的时候Person() ,括号里不要写名字。

  • 扩展可以定义属性。
  • 扩展必须和类定义和类实现同时编译,它不能对无源码的类扩展
  • 通常使用扩展来声明私有方法
Person 类
  1. #import <Foundation/Foundation.h>
  2. // Person 类
  3. @interface Person : NSObject
  4. // Person 类公开的方法
  5. -(void) print ;
  6. @end
Person 类扩展,扩展中声明私有元素
  1. // 引入原类
  2. #import "Person.h"
  3. // 扩展,扩展中定义私有元素
  4. @interface Person ()
  5. // 私有属性
  6. @property NSString *name ;
  7. // 私有方法
  8. -(void) privateMethod ;
  9. @end
Person 类的实现文件
  1. #import "PersonPrivate.h"
  2. @implementation Person
  3. // 生成私有getter、setter 方法
  4. @synthesize name ;
  5. // 实现公开方法
  6. -(void) print{
  7. [self privateMethod];
  8. }
  9. // 实现私有方法
  10. -(void) privateMethod{
  11. NSLog(@"private Method Execute ~~") ;
  12. }
  13. @end

使用Person 类

  1. // 引入Person 类
  2. #import "Person.h"
  3. int main(int argc, const char * argv[])
  4. {
  5. @autoreleasepool {
  6. Person *p = [[Person alloc] init];
  7. // 调用类公开的方法
  8. [p print] ;
  9. // p.name ; 报错
  10. // [p privateMethod] ; 报错,name的getter、setter方法和privateMethod都是私有元素,外部无法调用
  11. }
  12. return 0;
  13. }


类别和扩展

时间: 2024-10-10 09:25:29

类别和扩展的相关文章

ios 中Category类别(扩展类)专题总结

原创地址   http://www.code4blog.com/archives/294 类别 类别是一种为现有的类添加新方法的方式. 利用Objective-C的动态运行时分配机制,可以为现有的类添加新方法,这种为现有的类添加新方法的方式称为类别catagory,他可以为任何类添加新的方法,包括那些没有源代码的类. 类别使得无需创建对象类的子类就能完成同样的工作 一.创建类别 1.声明类别 声明类别与声明类的形式很相似 @interface  NSString(NumberConvenienc

iOS开发之类别、扩展

类别: 在ios项目开发中允许使用类别为现有的类添加新的方法,并不需要创建子类.通过类别我们可以动态地为现有的类添加新的方法,可以将类的定义模块化地布局到多个相关文件中. 使用类别的好处为: 一.进行模块化设计 二.利用类别来调用私有方法 接口部分格式如下: @interface 已有类 (类别名) //方法的定义 ..... @end 注意:类别中通常只定义新的方法. 类别的实现部分的语法格式如下: @implmentation 已有类(类别名) //方法的实现 @end 我先创建一个old类

类别的扩展

类别的扩展 续 利用类别分散实现代码 在大型的项目中,一个类的实现可能很大,而且 .m 文件不能分离.可是使用类别能够将一个类的实现分散且有规律的组织在不同的文件里.还能够将一个类的实现分散到不同的框架中. 编程人员能够更加easy阅读代码并实现多人合作编码 版本号管理减少冲突 维护人员跟easy理解代码 在代码的头文件里,假如有例如以下这么多的成员变量,也就须要对应的 setter, 和 getter 方法 #import <Foundation/Foundation.h> @interfa

objective-c中Category类别(扩展类)专题总结

objective-c中Category 类别.扩展 专题总结 http://blog.csdn.net/jiajiayouba/article/details/21105873 分类: IOS 2014-03-12 18:19 1293人阅读 评论(0) 收藏 举报 类别扩展 objective-c中Category类别(扩展类)专题总结 objective-c类别的作用? 通过类别的方式,可以将类的实现分散到不同的文件里. haoxue 2011-11-19 14:03 类别 类别是一种为现

[ios]objective-c中Category类别(扩展类)专题总结

本文转载至 http://yul100887.blog.163.com/blog/static/20033613520126333344127/ objective-c类别的作用?通过类别的方式,可以将类的实现分散到不同的文件里. 类别类别是一种为现有的类添加新方法的方式.利用Objective-C的动态运行时分配机制,可以为现有的类添加新方法,这种为现有的类添加新方法的方式称为类别catagory,他可以为任何类添加新的方法,包括那些没有源代码的类.类别使得无需创建对象类的子类就能完成同样的工

OC中类别、扩展、协议与委托

类别(category)--通过使用类别,我们可以动态地为现有的类添加新方法,而且可以将类定义模块化地分不到多个相关文件中.通常只在类别中定义方法. 类别,接口部分的定义,通常该文件命名为已有"类+类别名.h" @interface 已有类 (类别名) //.......方法实现 @end 例如,考虑为NSNumber增加一个类别,则接口部分代码如下 <p style="margin-top: 0px; margin-bottom: 0px; font-family:

IOS 类别与扩展的区别 (category &amp; extensions)

类别 .h @interface NSString(XXXXXX) -(NSInteger)getLen; @end .m @implementation NSString(XXXXXX) -(NSInteger)getLen { return 0; } @end //////////////////////////////////////////////////////////////////////////////////////////////////// 扩展 .h @interface

Objective-c 05 类别 类扩展 委托 非正式协议 协议 代码块 并发性 队列

类别 为已经存在的类添加行为时,通常采用创建子类的方法,不过有时子类并不方便, 比如:创建NSString的子类,但是NSString实际上只是一个类簇的表面形式.因而为这样的类创建子类会非常困难.在其他情况下, 也许可以创建它的子类,但是用到的工具集和库无法帮你处理新类的对象的.例如:当使用stringWithFormat:类方法生成新字符串时,你创建的 NSString类的新子类就无法返回.   利用Objective-C的动态运行时分配机制,可以为现有的类添加新的方法.这些新的方法在Obj

ios 类别和扩展-赵小波

类别 @interface ClassName ( CategoryName ) // method declarations @end Category在iOS开发中使用非常频繁.尤其是在为系统类进行拓展的时候,我们可以不用继承系统类,直接给系统类添加方法,最大程度的体现了Objective-C的动态语言特性. 注意事项 1:类别是类的扩展,只可以声明方法,不可以声明变量.并且,类别的方法优先级较高,可覆盖原类方法. 2:类别的方法中,不可以调用super方法.--类别的局限 3:catego