你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> 【iOS深思錄】OC中的類擴展機制:Category類別和Extension類擴展

【iOS深思錄】OC中的類擴展機制:Category類別和Extension類擴展

編輯:IOS開發綜合

OC中類別(Category)是什麼?

Category類別是Objective-C言語中提供的一個靈敏的類擴展機制。類別用於在不得悉、不改動原來代碼的狀況下往一個曾經存在的類中添加新的辦法,只需求知道這個類的地下接口,而不需求知道類的源代碼。類別只能為已存在的類添加新的辦法,而不能添加實例變量。類別擴展的新辦法有更高的優先級,會掩蓋同名的原類的已無方法。

Category類別與其他特性的比擬?

與承繼Inheritance的比擬:

1.子類承繼是停止類擴展的另一種常用辦法,當然基於子類承繼的擴展愈加自在正式,既可以擴展屬性也可以擴展辦法。類別可以在不得悉、不改動原來代碼的狀況下往外面添加新的辦法,但也只能添加辦法,不能添加屬性,屬於功用上的擴展。類別擴展的優點是不需求創立一個新的類,而是在零碎中已有的類上直接擴展,不需求更改零碎類就可以添加並運用擴展辦法。

2.絕對於子類承繼擴展,類別的另一分明優勢是完成了功用的部分化封裝,擴展的功用只會在本類被援用時看到。 假定原類為UIButton,如今要運用類別擴展一些用於模塊A的辦法,那麼這些擴展辦法就可以定義在一個叫做UIButton+A.h的頭文件中,只要在援用UIButton+A.h的中央,才干看到原UIButton類有模塊A添加的那些擴展辦法,假如不需求模塊A的功用,不援用UIButton+A.h頭文件就看不到UIButton的那些擴展辦法的存在。

與擴展Extension的比擬:

Category類別和Extension擴展的分明不同在於,後者可以添加屬性。另外後者添加的辦法是必需要完成的。Extension可以以為是一個公有的匿名的Category。

類別有什麼作用和益處?類別的局限性和運用留意事項?

作用:

可以將類的完成分散到多個不同文件或多個不同框架中(擴大新的辦法) 可以創立對公有辦法的前向援用? 可以向對象添加非正式協議?

局限性:

類別只能向原類中添加新的辦法,且只能添加而不能刪除或修正原辦法,不能向原類中添加新的屬性;

類別向原類中添加的辦法是全局無效的而且優先級絕對最高,假如和原類的辦法重名,會無條件掩蓋掉原來的辦法,形成難以發現的潛在風險,因而運用類別添加辦法一定留意保證是單純的添加新辦法,防止掩蓋原來的辦法(可以經過添加該類別的辦法前綴來避免抵觸),否則原辦法被類別掩蓋了,團隊中其他成員不知情的狀況下用到這個被掩蓋的辦法會呈現意想不到的問題而難以發覺糾正。

Category類別和Extension類擴展的運用辦法?

類別和擴展的區別我們曾經知道了,最分明的是類別不可以添加新屬性而類擴展可以。類別的運用辦法很復雜,就是新建某個類的類別擴展文件,然後添加新的辦法。而類擴展並不常用,只是常用在.m文件中的頭部停止頭文件的公有屬性變量補充,也就是所謂的類的continue區域,是將不想暴露給內部的一些變量定義在類擴展中。

創立類別或擴展文件:

為工程添加新文件並選擇Objective-C File:
【IOS沉思錄】OC中的類擴展機制:Category類別和Extension類擴展

填寫自定義的擴展名後綴,然後選擇文件類型,這裡選擇Category類別或許Extension擴展,最後選擇要擴展的已有類:
【IOS沉思錄】OC中的類擴展機制:Category類別和Extension類擴展
【IOS沉思錄】OC中的類擴展機制:Category類別和Extension類擴展

創立之後失掉對應的類別文件:

【iOS沉思錄】OC中的類擴展機制:Category類別和Extension類擴展

添加新的擴展辦法:

這裡以擴展NSString類的辦法為例展現類別擴展的詳細用法,辨別添加一個類辦法和實例辦法,並在需求的中央調用:

類別頭文件辦法聲明:

/* NSString+Category.h */
#import <Foundation/Foundation.h>

@interface NSString (Category) {
    // 不可以添加實例變量,編譯器會直接報錯!
}

// 實例變量被制止,此處添加屬性變量是有意義的,定義的新的屬性變量編譯器不會為其自動生成存取辦法, 編譯器也制止了setter辦法的手動完成,由於無法直接獲得實例變量,無法為實例變量賦新值
//@property (nonatomic, copy) NSString *newString;

/**
 * 擴展一個類辦法
 */
+ (void)categoryClassMethodOfString;

/**
 * 擴展一個實例辦法
 */
- (void)categoryInstanceMethodOfString;

@end

類別辦法完成,類別的辦法可以不完成,不完成則不可調用否則會解體:

/* NSString+Category.m */
#import "NSString+Category.h"

@implementation NSString (Category)

+ (void)categoryClassMethodOfString {
    NSLog(@"categoryClassMethodOfString");
}

- (void)categoryInstanceMethodOfString {
    NSLog(@"categoryInstanceMethodOfString");
}

@end

在需求的類中引入類別頭文件NSString+Category.h,然後即可調用新辦法:

#import "NSString+Category.h"
// 1.調用類別擴展的類辦法
[NSString categoryClassMethodOfString];

// 2.調用類別擴展的實例辦法
NSString *string = [NSString stringWithFormat:@""];
[string categoryInstanceMethodOfString];

類擴展的普通用法:

類擴展即類的.m文件中@implementation之前開端的局部,所謂的類的continue區域:

@interface class name ()
// ...
@end

類擴展的作用原本是用於公有函數的前向聲明,但最新編譯器無需聲明也有相反的效果,因而公有辦法可在.m文件中恣意地位直接寫完成而無需在此處停止前向聲明,假如在此處聲明函數那麼一定要在前面停止完成,否則編譯器會給出正告。如今類擴展區域的作用次要是疾速定義類的公有屬性,行將暴露給內部的屬性變量定義在頭文件中,而不想暴露給內部的屬性則直接定義在類擴展區域。

/* 類擴展區域 */
@interface ViewController ()

// 類擴展屬性(默許為private, 類內部不可訪問)
@property (nonatomic,copy) NSString *extensionVariable;

/**
 * 類擴展辦法聲明,可省略,要在立即在前面停止函數完成
 */
- (void)extensionInstanceMethod;
+ (void)extensionClassMethod;

@end

【iOS沉思錄】OC中的類擴展機制:Category類別和Extension類擴展

【【iOS深思錄】OC中的類擴展機制:Category類別和Extension類擴展】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved