iOS资料面试码农的日常之iOS开发

iOS 关于Category(类目),Extension(延展)

2016-06-06  本文已影响985人  Go_
概述

最近再看关于iOS的基础知识,突然发现经常用到的一些技术的有些模糊,所以在这里做下总结,方便以后查阅.

一. Category - 类目

Category 是比继承更为简洁的方法来对Class进行扩展,无需创建子类就可以为现有的类动态添加方法,可以是项目内任何已经存在的类,甚至那些没有源代码的类.(看不到.m 文件的类)

 // 声明   
 @interface NSString (CjString)

  - (NSString *) cj_AppendingLength;

 @end

 // 实现
 @interface NSString (CjString)

- (NSString *)cj_AppendingLength{
      NSString *result = @"";

      if (self) {
    
    result = [NSString stringWithFormat:@"%@ length is %ld", self, [self length]];
     }
   return result;
  }
@end
注意
二. Extension - 延展

延展可以理解成是匿名的Category,可以用来给当前来添加属性和新方法,不作用在Subclass.只能对有implementation源代码的类写Extension,对于没有implementation源代码的类,比如framework class,是不可以的.

三. Protocol - 协议
这里简单演示下委托(传值)
效果图:点击NextVC的返回按钮就可以把对应TextView的值回传

协议:

@protocol TestDelegate <NSObject>

@required

- (void)sendReuiedValue:(NSString *)value;
@optional

- (void)sendOptionalValue:(NSString *)value;
@end

@interface NextVC : UIViewController

@property (nonatomic, weak) id delegate;

@end

委托人:

 #import "NextVC.h"

 - (IBAction)BackAction:(id)sender {

     if (_rTextField.text != nil) {
    
        [_delegate sendReuiedValue:_rTextField.text];
    }
     if (_oTextField.text != nil) {
    
        [_delegate sendOptionalValue:_oTextField.text];
    }
     [self dismissViewControllerAnimated:YES completion:^{   
    }];
}

实现者:
#import "ViewController.h"
#import "NextVC.h"

@interface ViewController ()<TestDelegate>
@property (weak, nonatomic) IBOutlet UILabel *nLabel;
@property (weak, nonatomic) IBOutlet UILabel *oLabel;
@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.

}

 - (IBAction)goToVC:(id)sender {

     NextVC *nextVC = [[UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]] instantiateViewControllerWithIdentifier:@"NextVC"];

    // 指定代理人
     [nextVC setDelegate:self];

     [self presentViewController:nextVC animated:YES completion:^{
    
      }];
}
// 必须实现的方法
- (void)sendReuiedValue:(NSString *)value{

       if (value != nil) {
    
         [_nLabel setText:value];
   }
}

// 可选实现的方法
- (void)sendOptionalValue:(NSString *)value{

     if (value != nil) {
    
       [_oLabel setText:value];
   }
}

总结

Category (分类) 可以将可以复用的方法进行整理, 可以将某个类进行解耦,使其不至于太过臃肿.Protocol(协议) 可以声明一些公用的方法,这样在项目里面查看起来就会比较正规,整洁.具体就看大家的习惯了.

上一篇 下一篇

猜你喜欢

热点阅读