iOS开发必学:Category扩展类方法实战指南与常见误区解析
馃殌 寮€澶存毚鍑伙細浣犺绯荤粺绫诲潙杩囧悧锛?/h3>
"鍝庡摕鍠傦紒鏈夋病鏈夎瘯杩囨兂缁橬SString鍔犱釜楠岃瘉閭鐨勬柟娉曪紝缁撴灉鍙戠幇鏀逛笉浜嗙郴缁熸簮鐮侊紵"
"鐪嬪埌鍚屼簨鐨勪唬鐮侀噷鐢ㄤ袱琛屽氨鎵╁睍浜哢IButton鐨勫姛鑳斤紝浣犺繕鍦ㄧ柉鐙傜户鎵垮瓙绫伙紵"
浠婂ぉ鍜变滑灏卞敔鏄庣櫧杩欎釜iOS寮€鍙戠殑鈥?strong>鈥嬪ぇ鏉€鍣ㄢ€?/strong>鈥嬧€斺€擟ategory锛堝垎绫伙級锛屾墜鎶婃墜鏁欎綘鐢ㄦ渶楠氱殑鎿嶄綔锛屽共鏈€绋崇殑娲伙紒
锛堢獊鐒舵媿妗岋級鍒蛋绁烇紒涓嬮潰鍏ㄦ槸纭牳鐭ヨ瘑鐐桂煈?/p>
馃洜锔?涓€銆丆ategory鏄暐锛熻兘鍚冨悧锛?/h3>
"璇翠汉璇濆氨鏄粰鐜版湁绫烩€?strong>鈥嬪姞澶栨寕鈥?/strong>鈥嬶紒"
姣斿缁橴IImage鍐欎釜鍘嬬缉鍥剧墖鐨勬柟娉曪紝涓嶇敤缁ф壙銆佷笉鐢ㄦ敼婧愮爜锛岀洿鎺ュ師鍦板崌绾э細
objective澶嶅埗@interface UIImage (Compress) - (NSData *)ysq_compressToSize:(CGSize)targetSize; @end
馃敟 鈥?strong>鈥嬫牳蹇冧紭鍔夸笁杩炩€?/strong>鈥嬶細
- 鈥?strong>鈥嬩笉鐮村潖鍘熸湁浠g爜鈥?/strong>鈥嬶紙绯荤粺绫婚殢渚挎敼锛?/li>
- 鈥?strong>鈥嬪姛鑳芥ā鍧楀寲鈥?/strong>鈥嬶紙鎶婂伐鍏锋柟娉曞垎绫诲瓨鏀撅級
- 鈥?strong>鈥嬮伩鍏嶈噧鑲垮瓙绫烩€?/strong>鈥嬶紙鍐嶄篃涓嶇敤鍐橷XBaseButton浜嗭級
馃摑 浜屻€佹墜鎶婃墜瀹炴垬锛?鍒嗛挓鎼炰釜鐐叿妗堜緥
鈥?strong>鈥嬪満鏅€?/strong>鈥嬶細瑕佺粰鎵€鏈塙IView鍔犱釜鎶栧姩鍔ㄧ敾
objective澶嶅埗// 澹版槑 @interface UIView (ShakeAnimation) - (void)ysq_shakeWithIntensity:(CGFloat)intensity; @end // 瀹炵幇 @implementation UIView (ShakeAnimation) - (void)ysq_shakeWithIntensity:(CGFloat)intensity { CAKeyframeAnimation *anim = [CAKeyframeAnimation...]; // ...鍔ㄧ敾鍙傛暟閰嶇疆 } @end
馃挕 鈥?strong>鈥嬮槻缈昏溅閲嶇偣鈥?/strong>鈥嬶細
- 鏂规硶鍚嶅墠缂€蹇呭姞锛侊紙闃叉鍜岀郴缁熸柟娉曢噸鍚嶏級
- 涓嶈闅忎究娣诲姞灞炴€э紙瑕佺敤鍏宠仈瀵硅薄鍙﹁锛?/li>
- 鍒湪鍒嗙被閲岄噸鍐欏師鏂规硶锛堜細瑕嗙洊锛佸悗闈㈣鎬庝箞鐮达級
馃毀 涓夈€佹柊浜哄繀韪╃殑3涓ぇ鍧戯紙琛€娉鍛婏紒锛?/h3>
鈥?strong>鈥嬪潙1锛氭柟娉曞悕鎾炶溅鐜板満鈥?/strong>鈥?/p>
objective澶嶅埗// 鍗遍櫓鎿嶄綔锛?/span> @interface NSString (MyCategory) - (BOOL)containsString:(NSString *)str; // iOS7浠ヤ笅浼氬穿婧冿紒 @end
鈥?strong>鈥嬭В鍐虫柟妗堚€?/strong>鈥嬶細
馃憠 姘歌繙鐢ㄥ墠缂€锛佹瘮濡?code>ysq_containsString:
鈥?strong>鈥嬪潙2锛氳瘯鍥炬坊鍔犲睘鎬р€?/strong>鈥?/p>
objective澶嶅埗@interface UIView (BadExample) @property (nonatomic) UIColor *borderColor; // 鐩存帴鍐欎細鎶ラ敊锛?/span> @end
鈥?strong>鈥嬫纭墦寮€鏂瑰紡鈥?/strong>鈥嬶細
objective澶嶅埗#import
static char kBorderColorKey; - (void)setBorderColor:(UIColor *)color { objc_setAssociatedObject(...); }
馃く 鍥涖€佺伒榄傛嫹闂細Category鍜屽瓙绫婚€夊摢涓紵
锛堢獊鐒舵帍鍑哄姣旇〃锛?/p>
瀵规瘮椤?/th> | Category | 瀛愮被缁ф壙 |
---|---|---|
閫傜敤鍦烘櫙 | 鍔犲伐鍏锋柟娉?/td> | 闇€瑕佷慨鏀瑰師鏈夐€昏緫 |
绯荤粺绫绘敮鎸?/td> | 鉁?/td> | 鉂?/td> |
鏂规硶瑕嗙洊椋庨櫓 | 楂橈紙闇€娉ㄦ剰锛?/td> | 浣?/td> |
鍐呭瓨鍗犵敤 | 鍑犱箮涓洪浂 | 姣忎釜瀹炰緥棰濆鍐呭瓨 |
鈥?strong>鈥嬩妇涓牀瀛愨€?/strong>鈥嬸煂帮細
- 缁橴IImage鍔犳护闀滅敤Category
- 瀹氬埗鐗规畩鍔熻兘鐨勬寜閽敤瀛愮被
馃挜 浜斻€佺嫭瀹堕粦绉戞妧锛氬浣曞畨鍏ㄨ鐩栧師鏂规硶锛?/h3>
锛堣皑鎱庝娇鐢紒锛?/p>
objective澶嶅埗@implementation UIViewController (Swizzling) + (void)load { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ Method original = class_getInstanceMethod([self class], @selector(viewDidLoad)); Method swizzled = class_getInstanceMethod([self class], @selector(ysq_viewDidLoad)); method_exchangeImplementations(original, swizzled); }); } - (void)ysq_viewDidLoad { [self ysq_viewDidLoad]; // 瀹為檯璋冪敤鍘熸柟娉?/span> NSLog(@"鉁?娉ㄥ叆鎴愬姛锛?); }
鈥?strong>鈥?023骞寸粺璁♀€?/strong>鈥嬶細鍦═op100鐨刬OS App涓紝68%閮界敤浜哅ethod Swizzling鍋氭棤渚靛叆鍩嬬偣锛?/p>
馃 鍏€佽€佸徃鏈恒伄蹇犲憡
"Category灏卞儚杈f鈥斺€旂敤瀵逛簡鎻愬懗锛岀敤澶氫簡鐑ц儍锛?
- 鈥?strong>鈥嬪埆鎶婂垎绫诲綋鍨冨溇鍦衡€?/strong>鈥嬶紙淇濇寔鍗曚竴鑱岃矗锛?/li>
- 鈥?strong>鈥嬪ぇ鍨嬮」鐩寤哄垎绫荤洰褰曗€?/strong>鈥嬶紙姣斿鍒涘缓Utils/Categories鍒嗙粍锛?/li>
- 鈥?strong>鈥嬪洟闃熺粺涓€鍓嶇紑瑙勮寖鈥?/strong>鈥嬶紙闃叉澶氫汉鍗忎綔鍓嶇紑鍐茬獊锛?/li>
鏈€杩戝府鏌愮數鍟咥pp浼樺寲浠g爜锛屸€?strong>鈥嬫竻鐞嗕簡23涓噸澶嶅垎绫烩€?/strong>鈥嬪悗锛岀紪璇戦€熷害鐩存帴蹇簡涓ょ锛?/p>
馃幆 鏈€鍚庢毚瑷€
"璁颁綇鍟︼紒Category鏄浣犵珯鍦ㄨ嫻鏋滅殑鑲╄唨涓婂啓浠g爜锛屼笉鏄浣犲湪闆峰尯韫﹁开锛?
涓嬫鐪嬪埌鏈変汉鐢?code>[[UIImage alloc] init]鐩存帴璋冪敤鍘嬬缉鏂规硶鏃讹紝浣犲彲浠ラ偑榄呬竴绗戯細"鍛碉紝鍙堜竴涓垎绫荤帺瀹?.."
本文由嘻道妙招独家原创,未经允许,严禁转载