你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發基礎 >> @protocol 的一個小細節

@protocol 的一個小細節

編輯:IOS開發基礎

1.jpg

作者:曉月 授權本站轉載。

前不久重構一個類, 用protocol做了一些特別的事情, 結果被坑了. 先不說怎麼被坑, 我們來一段代碼, 大伙猜猜結果是啥?

@protocol ProtocolA  @end
@protocol ProtocolB  @end
@interface ClassB : NSObject  @end
@protocol ProtocolC  @end
@interface ClassC : NSObject  @end
@implementation ClassC @end
{
    Protocol *a = NSProtocolFromString(@"ProtocolA");
    NSLog(@"%@", a);
    Protocol *b = NSProtocolFromString(@"ProtocolB");
    NSLog(@"%@", b);
    Protocol *c = NSProtocolFromString(@"ProtocolC");
    NSLog(@"%@", c);
}

結果是

2015-12-09 17:37:54.303 ProtocolTest[990:47869] (null)
2015-12-09 17:37:54.303 ProtocolTest[990:47869] (null)
2015-12-09 17:37:54.304 ProtocolTest[990:47869]

ProtocolA, ProtocolB竟然是null. 為什麼會取不到值呢?

我猜測是protocol初始化的問題. 先去看看protocol的定義:

#elif __OBJC2__
#include // All methods of class Protocol are unavailable. 
// Use the functions in objc/runtime.h instead.
__OSX_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0)
@interface Protocol : NSObject
@end
#else
!__OBJC2__ 直接略過
#endif

可見Protocol也是一個類.

這時我猜測

@protocol ProtocolC  @end

只是申明了一個類, 實際編譯後並沒有這個類.

我們來寫一段測試代碼, 寫一個只有聲明的類, 看看最終有沒有這個類,

@interface ClassD : NSObject @end
    Class dd = NSClassFromString(@"ClassD");
    NSLog(@"%@", dd);

果然輸出的結果是null

2015-12-09 20:42:36.315 ProtocolTest[735:11451] (null)


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