码迷,mamicode.com
首页 > 其他好文 > 详细

类别和扩展

时间:2015-03-11 23:20:17      阅读:135      评论:0      收藏:0      [点我收藏+]

标签:

类别

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

  • 类别的命名通常使用"类+类别名"的形式,如 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. }

类别和扩展

标签:

原文地址:http://www.cnblogs.com/mrwu/p/4331156.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!