標籤:objective-c 最佳化
本文會不定期更新,轉載請註明出處http://blog.csdn.net/uxyheaven/article/details/47780957
Objective-C中條件陳述式的最佳化
要求判斷一個NSArray有值,嚴謹的寫法是
NSString *object = @""; if (object && [object isKindOfClass:[NSArray class]] && ((NSArray *)object).count > 0) { NSLogDD }
先判斷這個object非空,再判斷是NSArray類型,再判斷count>0,如果順序寫成
NSString *object = @""; if (object && ((NSArray *)object).count > 0 && [object isKindOfClass:[NSArray class]]) { NSLogDD }
則會運行錯誤,因為if裡的代碼是串列.
因此,對於多條件的if語句,尤其是大量啟動並執行,我們可以調整 (條件) 的順序,來改善代碼效率.如:
[scores enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { if (obj > 59 && obj != 100) { NSLogDD } }];
當我們取考試及格,但是又不是滿分的人,通常情況下就可以把 > 59 放到前面(通常情況下滿分的人少).
當一段邏輯有多個if出現的情況,如:
+(UIControlEvents)eventWithName:(NSString *)name{ if([name isEqualToString:@"UIControlEventTouchDown"]) return UIControlEventTouchDown; if([name isEqualToString:@"UIControlEventTouchDownRepeat"]) return UIControlEventTouchDownRepeat; if([name isEqualToString:@"UIControlEventTouchDragInside"]) return UIControlEventTouchDragInside; if([name isEqualToString:@"UIControlEventTouchDragOutside"]) return UIControlEventTouchDragOutside; if([name isEqualToString:@"UIControlEventTouchDragEnter"]) return UIControlEventTouchDragEnter; if([name isEqualToString:@"UIControlEventTouchDragExit"]) return UIControlEventTouchDragExit; if([name isEqualToString:@"UIControlEventTouchUpInside"]) return UIControlEventTouchUpInside; if([name isEqualToString:@"UIControlEventTouchUpOutside"]) return UIControlEventTouchUpOutside; if([name isEqualToString:@"UIControlEventTouchCancel"]) return UIControlEventTouchCancel; if([name isEqualToString:@"UIControlEventTouchDown"]) return UIControlEventTouchDown; if([name isEqualToString:@"UIControlEventValueChanged"]) return UIControlEventValueChanged; if([name isEqualToString:@"UIControlEventEditingDidBegin"]) return UIControlEventEditingDidBegin; if([name isEqualToString:@"UIControlEventEditingChanged"]) return UIControlEventEditingChanged; if([name isEqualToString:@"UIControlEventEditingDidEnd"]) return UIControlEventEditingDidEnd; if([name isEqualToString:@"UIControlEventEditingDidEndOnExit"]) return UIControlEventEditingDidEndOnExit; if([name isEqualToString:@"UIControlEventAllTouchEvents"]) return UIControlEventAllTouchEvents; if([name isEqualToString:@"UIControlEventAllEditingEvents"]) return UIControlEventAllEditingEvents; if([name isEqualToString:@"UIControlEventApplicationReserved"]) return UIControlEventApplicationReserved; if([name isEqualToString:@"UIControlEventSystemReserved"]) return UIControlEventSystemReserved; if([name isEqualToString:@"UIControlEventAllEvents"]) return UIControlEventAllEvents; return UIControlEventAllEvents;}
我們可以通過 把多個if 改成if () else if… 來最佳化邏輯,同樣可以合理的安排條件的順序.
還有一種更加優美的方法,用字典來代替if, 如
XY_DicControlStringEvent = [@{@"UIControlEventTouchDown": @(UIControlEventTouchDown), @"UIControlEventTouchDownRepeat": @(UIControlEventTouchDownRepeat), @"UIControlEventTouchDragInside": @(UIControlEventTouchDragInside), @"UIControlEventTouchDragOutside": @(UIControlEventTouchDragOutside), @"UIControlEventTouchDragEnter": @(UIControlEventTouchDragEnter), @"UIControlEventTouchDragExit": @(UIControlEventTouchDragExit), @"UIControlEventTouchUpInside": @(UIControlEventTouchUpInside), @"UIControlEventTouchUpOutside": @(UIControlEventTouchUpOutside), @"UIControlEventTouchCancel": @(UIControlEventTouchCancel), @"UIControlEventValueChanged": @(UIControlEventValueChanged), @"UIControlEventEditingDidBegin": @(UIControlEventEditingDidBegin), @"UIControlEventEditingChanged": @(UIControlEventEditingChanged), @"UIControlEventEditingDidEnd": @(UIControlEventEditingDidEnd), @"UIControlEventEditingDidEndOnExit": @(UIControlEventEditingDidEndOnExit), @"UIControlEventAllTouchEvents": @(UIControlEventAllTouchEvents), @"UIControlEventAllEditingEvents": @(UIControlEventAllEditingEvents), @"UIControlEventApplicationReserved": @(UIControlEventApplicationReserved), @"UIControlEventSystemReserved": @(UIControlEventSystemReserved), @"UIControlEventAllEvents": @(UIControlEventAllEvents) } retain];
+(UIControlEvents)eventWithName:(NSString *)name{ return [[XY_DicControlStringEvent objectForKey:name] integerValue];}
這裡雖然有個裝箱拆箱的過程,但是邏輯比大量的 if 清晰多了.
我們還可以用三目來最佳化代碼,當然了這個只是說可以,實際不建議用.
如果真的的要用,請按照這種寫法:
BOOL b = YES; // 普通寫法 if (b) { printf("11"); } else { printf("22"); } // 三目寫法 (b) ? ({ printf("11"); }) : ({ printf("22"); });
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
Objective-C中條件陳述式的最佳化