类目的基本概念:

如果有封装好的一个类,随着程序功能的增加,需要在类中增加一个方法,那我们就不必在那个类中做修改或者再定义一个子类,只需要在用到那个方法时添加一个该类的类目即可.

1.在类目定义的方法中,会成为原始类的一部分,与其他方法的调用没有区别

2.通过给父类定义类目方法,其子类也会继承这些方法.如果子类添加类目方法,父类则不会拥有子类的类目方法.

类目方法的应用:

对现有类的扩展:在类目中增加的方法会被子类所继承,而且运行时跟其他的方法没有区别

作为子类的替代手段:不需要定义和使用一个子类,你可以通过类目直接向已有的类里增加方法

对类中的方法归类:利用category把一个庞大的类划分为小块来分别进行开发,从而更好的对类中的方法进行更新和维护

类目方法的局限性:

无法向类目中,添加新的实例变量,类目没有位置来容纳实例变量,如果想增加类的实例变量,只能通过自定义子类的方式

若在类目中覆盖现有类的方法,这样会引起super消息的断裂,因为类目中的方法具有更高优先级,一般不要覆盖现有类中的方法

类目的命名与用法:

类目的命名规则:类名+扩展方法(在创建的时候,系统会自动填写类名,自己只需要写方法名称就好)

类目的接口声明与类的定义十分相似,但类目不继承父类,只需要带有一个括号,表明该类目的主要用途

延展的基本概念:

类的延展就如同匿名的类目,延展中声明的方法在类本身的@implementation和对应的@end之间实现

类有时需要方法只有自己所见,我们可以通过延展的方式定义类的私有方法

类目的实现可以通过创建一个类目来实现,当然我们也可以直接在要添加的类中的.h直接写入类目

示例代码:

Computer.h

#import <Foundation/Foundation.h>@interface Computer : NSObject@property(nonatomic,copy)NSString *name;@end@interface Computer (printf)  //直接添加了类目
-(void)printf;@end//可以在.h中创建多个类目
/*@interface <#class name#> (<#category name#>)@end*/

Computer.m

#import "Computer.h"
//延展
//在这里写私有的方法和变量,当然方法可以直接写到@implementation中,但是在这里写了后方便日后的查找
@interface Computer ()@end
@implementation Computer-(id)init{if (self = [super init]) {_name = [[NSString alloc]init];}return self;
}@end@implementation Computer (printf)-(void)printf{NSLog(@"%@",_name);
}@end

Computer+Creation.h

#import "Computer.h"@interface Computer (Creation)-(void)state;@end

Computer+Creation.m

#import "Computer+Creation.h"@implementation Computer (Creation)-(void)state{NSLog(@"游戏中");
}
@end

main.m

#import <Foundation/Foundation.h>
#import "Computer.h"
#import "Computer+Creation.h"
int main(int argc, const char * argv[])
{@autoreleasepool {// insert code here...NSLog(@"Hello, World!");Computer *computer = [[Computer alloc]init];[computer state];computer.name = @"mac";[computer printf];}return 0;
}

输出结果:

2013-12-31 11:50:29.514 类目和延展[1378:303] Hello, World!
2013-12-31 11:50:29.515 类目和延展[1378:303] 游戏中
2013-12-31 11:50:29.516 类目和延展[1378:303] mac

明天复习下协议和代理,把基本概念搞清楚

转载于:https://www.cnblogs.com/mo-shou/p/3499084.html

objective-c 类目(Category)和延展(Extension)相关推荐

  1. category(类目)的用法,NSDate,NSTimeInterval类的使用

    分类, 类目, category目的: 为没有源代码的类添加方法(只能添加方法, 不能添加实例变量)是扩充一个类的功能的方式之一, 为原有类扩充的方法成为原类的一部分, 使用即可分类也分为.h(接口部 ...

  2. Category(分类/类目)、Protocol(协议)、Extension(扩展/延展)

    Category(分类/类目): 利用Objective-C的动态运行时分配机制,Category提供了一种比继承更为简洁的方法来对class进行扩展,无需创建对象类的子类就能为现有的类添加新方法,可 ...

  3. 类目,延展,协议的基本概念

    Catgory(类目/分类)     1.分类是给原有类添加方法,它只能添加方法,不能添加属性(成员变量)     2.分类中定义@property,只会生成setter/getter方法的声明,没有 ...

  4. 功能点分析:商品类目表

    前言 作为电商网站,必然要有商品类目表,以便商品分类检索.而设计商品类目表,又是一件特别繁杂的事情.一件商品可能有多个类目来检索出来,比如苹果手机,可以从品牌检索也可以从手机检索.一个类目对应多个商品 ...

  5. lazada新手开店之后,怎样选择正确类目来发布产品?

    一.Lazada产品流量从何而来? 1.导航搜索 通过主页类目导航栏查找: ● Shop Categories(按类目购物) ● 选择一级主类目 ● 选择二级子类目 ● 引导至该子类目页面;可继续选择 ...

  6. ECshop网点程序优化-后台添加类目自动选择上次父类目并计算Sort Order

    如果在ECshop后台批量添加过大量类目的人都能体会到是多么的不方便(这点还是要说一下ECshop的产品经理,细节上还是要多注意),每次添加都需要在几百个类目里面找到要添加的父类目也是一个麻烦事,比如 ...

  7. 多类目MoE模型在京东电商搜索中的应用

    文章作者:肖茁建博士 京东 算法工程师 编辑整理:Hoh 出品平台:DataFunTalk 导读:商品搜索引擎是电商平台满足用户购物需求的一个重要系统,它根据用户输入的搜索词,返回个性化的排序列表,以 ...

  8. Laravel5中基于jQuery实现分层级的类目树结构方法

    2019独角兽企业重金招聘Python工程师标准>>> Laravel5中基于jQuery实现分层级的类目树结构方法 下面时间财富网小编们来了解一下关于Laravel 5 中基于 j ...

  9. 电商类目表创建类目树

    表结构 //获取类目树 public function getAllCateTree($forceRefreshCache = false) {$allCateTreeRedisKey = 'xxx' ...

最新文章

  1. 17.splash_case02
  2. win10浏览器_[系统] win10浏览器上网问题
  3. 数据结构与算法:排序算法的稳定性以及各性能比较python实现
  4. bootstrap 总结
  5. ArcGIS Runtime SDK for Android开发之调用GP服务(异步调用)
  6. expect脚本中,变量的写法
  7. VS2010 MVC的 安装
  8. android显示当前时间
  9. java毕业设计古典舞在线交流平台mybatis+源码+调试部署+系统+数据库+lw
  10. 软考(软件设计师)考点总结 -- 计算机组成与体系结构
  11. java axis_Java 使用Axis实现WebService实例
  12. unity编译器安装路径_1.安装Unity
  13. 【微信小程序】发布流程及发布审核时如何提供测试账号?
  14. 给IT新人的15点建议
  15. uniapp通过mixin隐藏所有页面右上角分享按钮
  16. 硬盘维修彻底揭密 新手必读
  17. 海外跨境直播面临的难题及解决方案
  18. 三十二楼层选几层最好_楼层风水几楼最好 1一32高楼层选最佳楼层
  19. DZ先生怪谈国标28181之大型监控组网ntpd校时方案
  20. navicat连接mysql忘记密码_navicat忘记密码怎么办

热门文章

  1. 卡尔曼滤波器学习笔记(二)
  2. 树莓派 - 设置只读文件系统,避免分区错误
  3. 长度最小的子数组--滑动窗口
  4. strcpy和memcpy的区别?
  5. C++ vector容器删除操作
  6. php答题评分,Thinkphp 答题 评语
  7. java中如何确定是数字_java中怎么判断指定的数据是字符串是否是数字?
  8. 8086汇编-实验10-字符打印程序
  9. ROS初学笔记 - C++11与PCL库冲突问题
  10. 基于android的lbs技术,基于Android的LBS应用研究