根據this article目標C中的For循環可以使用IMP & IMP進行優化。我現在一直在想這個想法,今天我一直在嘗試一些測試。 然而,似乎爲一個班級工作,似乎並沒有爲另一個工作。此外,我想知道加速是如何發生的? 通過迴避objC_mesgSent?目標C用於使用SEL和IMP進行環路優化
問題1 這是怎麼回事:
Cell *cell;
for (NSMutableArray *row in self.data) {
for (Data *d in row){
cell = [[Cell alloc] initWithRect:tmp_frame];
[self addSubview:cell.view];
[self.cells addObject:cell];
比這更糟糕的
:
SEL addCellSel = @selector(addObject:);
IMP addCellImp = [self.cells methodForSelector:addCellSel];
Cell *cell;
for (NSMutableArray *row in self.data) {
for (Data *d in row){
cell = [[Cell alloc] initWithRect:tmp_frame];
[self addSubview:cell.view];
addCellImp(self.cells,addCellSel,cell);
問題2 爲什麼會失敗? (注意自我是從UIView的繼承的類)
SEL addViewSel = @selector(addSubview:);
IMP addViewImp = [self methodForSelector:addViewSel];
Cell *cell;
for (NSMutableArray *row in self.data) {
for (Data *d in row){
cell = [[Cell alloc] initWithRect:tmp_frame];
addViewImp(self,addViewSel,cell.view);
[self.cells addObject:cell];
錯誤:
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[SimpleGridView addSubview:]: unrecognized selector sent to instance 0xaa3c400'
告訴我方法addSubview還沒有在我的課「SimpleGridView」被發現。 但是,當我嘗試:
if ([self respondsToSelector:addViewSel]){
NSLog(@"self respondsToSelector(AddViewSel)");
addViewImp(self,addViewSel,cell.view);
} else {
NSLog(@"self does not respond to selector (addViewSel");
[self addSubview:cell.view];
}
我仍然得到完全相同的錯誤!
問題3 爲何無法設置一個選擇器&實施一類初始化/新方法,像這樣:
iContactsGridCell *cell;
SEL initCellSel = @selector(initWithRect:);
IMP initCellImp = [iContactsGridCell methodForSelector:initCellSel];
for (NSMutableArray *row in self.data) {
for (Data *d in row){
cell = initCellImp([iContactsGridCell new],initCellSel,tmp_frame);
參考: 類iContactsGridCell從類細胞繼承,其定義和實施
- (id) initWithRect:(CGRect)frame;
此外,鑄造沒有幫助(約合無法識別的選擇同樣的錯誤)
iContactsGridCell *cell;
SEL initCellSel = @selector(initWithRect:);
IMP initCellImp = [Cell methodForSelector:initCellSel];
for (NSMutableArray *row in self.data) {
for (Data *d in row){
cell = (iContactsGridCell *)initCellImp([Cell new],initCellSel,tmp_frame);
嘗試不同的組合,如:
IMP initCellImp = [Cell methodForSelector:initCellSel];
或者
cell = initCellImp([iContactsGridCell class],initCellSel,tmp_frame);
產生完全相同的錯誤。 所以,請告訴我,我錯過了什麼,這有什麼好處,是否有可能爲類初始化方法提供IMP/SEL? 此外,與此相比,C函數指針會更快嗎,還是上面所有的只是一個Objective-C函數指針包裝器? 謝謝! PS:我很抱歉,如果這些問題一次是太多的問題。
爲什麼不切換到純C呢? –
@RamyAlZuhouri大會。或者手動編譯原始機器碼。 (嚴重:這是一個微型優化。) – 2012-12-21 18:35:32
爲了記錄,您應該在調用IMP之前將IMP投射到正確的函數原型。 –