1. 主页 > 大智慧

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>鈥嬶細

  1. 鈥?strong>鈥嬩笉鐮村潖鍘熸湁浠g爜鈥?/strong>鈥嬶紙绯荤粺绫婚殢渚挎敼锛?/li>
  2. 鈥?strong>鈥嬪姛鑳芥ā鍧楀寲鈥?/strong>鈥嬶紙鎶婂伐鍏锋柟娉曞垎绫诲瓨鏀撅級
  3. 鈥?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鈥斺€旂敤瀵逛簡鎻愬懗锛岀敤澶氫簡鐑ц儍锛?

  1. 鈥?strong>鈥嬪埆鎶婂垎绫诲綋鍨冨溇鍦衡€?/strong>鈥嬶紙淇濇寔鍗曚竴鑱岃矗锛?/li>
  2. 鈥?strong>鈥嬪ぇ鍨嬮」鐩寤哄垎绫荤洰褰曗€?/strong>鈥嬶紙姣斿鍒涘缓Utils/Categories鍒嗙粍锛?/li>
  3. 鈥?strong>鈥嬪洟闃熺粺涓€鍓嶇紑瑙勮寖鈥?/strong>鈥嬶紙闃叉澶氫汉鍗忎綔鍓嶇紑鍐茬獊锛?/li>

鏈€杩戝府鏌愮數鍟咥pp浼樺寲浠g爜锛屸€?strong>鈥嬫竻鐞嗕簡23涓噸澶嶅垎绫烩€?/strong>鈥嬪悗锛岀紪璇戦€熷害鐩存帴蹇簡涓ょ锛?/p>


馃幆 鏈€鍚庢毚瑷€

"璁颁綇鍟︼紒Category鏄浣犵珯鍦ㄨ嫻鏋滅殑鑲╄唨涓婂啓浠g爜锛屼笉鏄浣犲湪闆峰尯韫﹁开锛?

涓嬫鐪嬪埌鏈変汉鐢?code>[[UIImage alloc] init]鐩存帴璋冪敤鍘嬬缉鏂规硶鏃讹紝浣犲彲浠ラ偑榄呬竴绗戯細"鍛碉紝鍙堜竴涓垎绫荤帺瀹?.."

本文由嘻道妙招独家原创,未经允许,严禁转载