4
A
回答
6
對於任何最近版本的Clang,這確實是可能的。
Apple ABI for Blocks是私有的,但也是published。由於該文件告訴我們編譯器將用於Block對象的佈局,因此我們可以將這些信息複製到頭文件中並使用它來訪問塊的組件。
Mike Ash的MABlockForwarding project就是這麼做的(參見article) - 這個文件頂部的大部分內容都是來自ABI文檔的複製粘貼。他創建了我們感興趣的東西是BlockSig()
功能:
static const char *BlockSig(id blockObj)
{
struct Block *block = (__bridge void *)blockObj;
struct BlockDescriptor *descriptor = block->descriptor;
assert(block->flags & BLOCK_HAS_SIGNATURE);
int index = 0;
if(block->flags & BLOCK_HAS_COPY_DISPOSE)
index += 2;
return descriptor->rest[index];
}
將返回(對於有它(他們都與最近鐺做)塊),一個type encoding string描述塊的迴歸和論證類型。從那裏,你可以創建一個NSMethodSignature
對象,並請它替其numberOfArguments
:
NSString * (^block)(int, NSArray *) = ^NSString * (int i, NSArray * a){
return @"Oh, yeah!";
};
const char * types = BlockSig(block);
NSMethodSignature * sig = [NSMethodSignature signatureWithObjCTypes:types];
[sig numberOfArguments];
結果有3,因爲它包含了塊本身隱藏的參數(和塊不使用隱藏_cmd
或者它會是4)。
1
答案是你不能。見邁克灰的頁面上對此評論:
Search for Intropection這sends you here
那麼,什麼是你真正的問題?如果你正確地構造參數,你可以確保你的系統正常工作。例如,你可以做C++用參數的默認值做的事情,並且將每個塊轉換爲一個類型,該類型需要最大數量的參數,並且總是將多個項目推送到堆棧上。或者,您始終可以將第一個參數作爲您在堆棧上推送的參數的數量。如果你推送對象而不是數字/指針,那麼你可以查看每個參數的類並動態適應。
相關問題
- 1. 找出一個方法的PyObject多少個參數需要
- 2. 函數需要多少個參數?
- 3. transform()需要多少個參數?
- 4. optparse-applicative:需要至少一個參數
- 5. System.Data.OleDb.OleDbException需要一個或多個參數
- 6. 找出需要多少時間做一個AJAX請求
- 7. TypeError:file()至多需要3個參數(給出4個參數)
- 8. 需要多個強參數
- 9. QFile需要多個參數?
- 10. 使用一個ParamArray,但至少需要一個參數
- 11. TypeError:__init __()至少需要2個參數(給出1個)error
- 12. reportlab TypeError:drawImage()至少需要4個參數(給出5個)
- 13. 主要功能需要多少個參數?
- 14. lasagne.layers.DenseLayer:「__init __()至少需要3個參數」
- 15. Flickrapi給出了一個TypeError:__init __()至少需要3個參數(給出3個參數)
- 16. 一個ViewController需要多少內存?
- 17. TypeError:_init_()至少需要3個參數(給出2個參數)MonkeyRunner
- 18. 警告:mysqli_query()需要至少2個參數,給出1個參數。 MYSQLI新手
- 19. TypeError:update_info()至少需要4個參數(給出2個參數) - Odoo v10社區
- 20. Symfony2的路由:兩個可選參數 - 至少一個需要
- 21. 有多少個參數需要Haskell的foldr函數?
- 22. Flask:TypeError:函數至多需要2個參數(給出4個)
- 23. 我需要多少個雙倍投數
- 24. 這個數據庫需要多少?
- 25. 函數需要多少個字節?
- 26. 有沒有辦法知道一個方法需要多少個參數?
- 27. 找不到TypeError:__init __()需要3個參數(給出2個)
- 28. 多少參數做的strstr需要
- 29. 類型錯誤:__init __()至少需要3個參數(1給出)
- 30. 「類型錯誤:_new_()需要至少2個參數(1給出)」
謝謝Josh(當然還有Mike Ash)!我集成了幾行Mike的代碼來擴展我的斷言工具,它的工作原理!真棒 – Lio 2012-07-19 23:31:16