iOS 分类 使用注意事项

分类的 使用 基于 Objective-C 高度的动态性 。

应用场景:

一:  大部分场景下我们 拓展一个 类的功能 并且 希望在用到的时候 秩序引入头文件 或者 直接放入预编译文件 就能使用。

         例如:

         

#import <Foundation/Foundation.h>


@interface NSArray (ToJSONString)

- (NSString *)toJSONString;

@end


#import "NSArray+ToJSONString.h"


@implementation NSArray (ToJSONString)

- (NSString *)toJSONString{

    NSError *error = nil;

    NSData *jsonData = nil;

    //空格问题

    jsonData = [NSJSONSerialization dataWithJSONObject:self

                                                   options:0

                                                     error:&error];

    if ([jsonData length] > 0 && error == nil){

        

        NSString *jsonString = [[NSString alloc] initWithData:jsonData

                                                     encoding:NSUTF8StringEncoding];

        return jsonString;

    }else{

        return nil;

    }

}

@end


   我们引入这个为 NSArray 拓展这个功能。在工程中使用


二:  这种场景 很少看见开发者使用 类中 经常容易填满各种方法,而这些方法的代码则全部堆在一个巨大的实现文件里。有时这么做是合理的,因为即便通过重构 把这个类打散,效果也不会更好。在此情况下,可以通过 Objective-C 的 分类 机制 把类的逻辑代码 分入几个 分类中 。这对开发和调试都有好处。

#import <Foundation/Foundation.h>


@interface EOCPerson : NSObject


@property (nonatomic,copy)NSString *firstName;


@property (nonatomic,copy)NSString *lastName;


@property (nonatomic,strong,readonly) NSArray *friends;



- (instancetype)initWithFirstName:(NSString *)firstName

                         lastName:(NSString *)lastName;


/* Friendship Method  */

- (void)addFriend:(EOCPerson *)person;


- (void)removeFriend:(EOCPerson *)person;


- (BOOL )isFriendsWith:(EOCPerson *)person;



/* Work  Methods  */

- (void)performDaysWork;


- (void)takeVacationFromWork;


/*  Play methods */

- (void)goToTheCinema;


- (void)goToTheSportsGame;


@end

当然 你还可以 给上面这个类加更多的方法 一般 6个方法并不是太多 这里只是举例子 实际开发中 可能远远不止这些 数量。可以改写成如下的分类

@interface EOCPerson (Friendship)


- (void)addFriend:(EOCPerson *)person;


- (void)removeFriend:(EOCPerson *)person;


- (BOOL )isFriendsWith:(EOCPerson *)person;


@end


@interface EOCPerson (Work)


/* Work  Methods  */

- (void)performDaysWork;


- (void)takeVacationFromWork;


@end


@interface EOCPerson (Play)


/*  Play methods */

- (void)goToTheCinema;


- (void)goToTheSportsGame;


@end



注意: 在iOS SDK的开发 或者 framework 的开发中尽量的少使用分类, 因为 集成 你的SDK的 开发者 需要 加入 -force-load 在编译的时候 。不然会报错 。而对于 很多集成者来说 加这个编译选项可能 对他自己的项目本身会造成影响。而我们开发SDK 的目的是让它能够 尽可能多的集成 进入不同的工程中


实际上 分类 在apple 自己的框架中也有使用 。 NSURLRequest 类用于标准的URL 请求 , 同时 NSURLRequest 也可以支持HTTP请求  。 我们知道HTTP 请求时需要另外一些信息, 例如 HTTP Method (GET ,POST ), 和 HTTP header等。  但是 并不方便

继承 NSURLRequest 的子类中去实现,因为NSURLRequest, 包裹了 CFURLRequest 数据结构所需的C 函数。所有的 HTTP 都包含在这个结构体中。于是为了 拓展NSURLRequest 类把与 HTTP相关的 方法归入 名为 NSMutableHTTPRequest 的分类中。

这个  截图是 apple 官方文档中使用的。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值