ios - How to avoid accidental invocation on UIKit's private classes? -
ios - How to avoid accidental invocation on UIKit's private classes? -
i have encountered weird problem. in current project working complex views , doing modifications on fly.
e.g. if view responds settextcolor setting new color using next code
if ([view respondstoselector:propertyselector]) { // invoke method. } accidentally calling method returned uibuttonlabel (which private hidden class in uikit), , executed above method. in above code uibuttonlabel responded settextcolor: application crashed in invocation.
how avoid accidental access , invocation on uikit's private classes ?
yes can traverse reverse superclasses chain starting nsobject class, checking method not part of class_copymethodlist inspected class , it's metaclass (for class methods). while doing so, check inspected class not coming [nsbundle mainbundle] ([nsbundle bundleforclass:]) does, can terminate search - reached code. but, can imagine, caching it's really slow way of doing things.
you improve of redesigning code: seek using conformstoprotocol: instead of respondstoselector. illustration declare protocol
@protocol xyzsettablecolor <nsobject> @required - (void)setsomethingwithcolor:(uicolor *)textcolor; @end then, in class (classes) want declare conforms protocol (and implement required methods)
@interface xyzmycontrol : uicontrol <xyzsettablecolor> @end then later, when want create sure passed component qualified execute specified method:
- (void)applytextcolor:(uicolor *)color tocontrol:(id)control { if ([control conformstoprotocol:@protocol(xyzsettablecolor)]) { [(id<xyzsettablecolor>)control setsomethingwithcolor:color]; } } ios uiview uikit private-methods
Comments
Post a Comment