
嘻道奇闻
- 文章199742
- 阅读14625734
iOS开发避坑指南:重写这5类父类方法时为何总崩溃?
馃挜 "鏄ㄥぉ杩樺ソ濂界殑锛屾€庝箞涓€鏀逛唬鐮佸氨闂€€锛? 杩欐槸鏂版墜缇ら噷鏈€杩戞渶鎵庡績鐨勫搥鍤庛€傝€佸徃鏈虹敤鐫€娌′簨鐨勬柟娉曪紝鍒颁綘鎵嬩笂鎬庝箞灏卞穿浜嗗憿锛熶粖澶╁挶浠敤5涓湡瀹炵炕杞︾幇鍦猴紝鎵嬫妸鎵嬫暀浣犳偓宕栧嫆椹紒
馃毀 鍦烘櫙涓€锛氱敓鍛藉懆鏈熸柟娉曞繕璁皊uper璋冪敤锛?0%鏂版墜鏍借繃锛?/h3>
鈥?strong>鈥嬪穿婧冪幇璞♀€?/strong>鈥嬶細
椤甸潰榛戝睆/鎸夐挳鐐瑰嚮鏃犲弽搴?/p>
swift澶嶅埗// 閿欒绀鸿寖 override func viewWillAppear(_ animated: Bool) { print("椤甸潰瑕佹樉绀轰簡锛?) // 婕忎簡super.viewWillAppear(animated) }
鈥?strong>鈥嬪師鐞嗘彮绉樷€?/strong>鈥嬶細
UIViewController鐨勭敓鍛藉懆鏈熷氨鍍忓绫宠楠ㄧ墝锛屾紡鎺塻uper璋冪敤绛変簬鎵撴柇杩為攣鍙嶅簲銆俋code涓嶄細鎶ラ敊锛屼絾绯荤粺绾ф搷浣滐紙濡傝浆鍦哄姩鐢伙級鐩存帴缃㈠伐锛?/p>
鈥?strong>鈥嬫晳鍛芥柟妗堚€?/strong>鈥嬶細
- 鐢ㄤ唬鐮佺墖娈典繚瀛樻ā鏉?/li>
swift澶嶅埗override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) // 蹇呴』淇濈暀锛?/span> // 浣犵殑浠g爜 }
- 瀹夎SwiftLint鎻掍欢鑷姩妫€娴?/li>
馃敟 鍦烘櫙浜岋細鍒濆鍖栨柟娉曞弬鏁颁贡鏀癸紙缂栬瘧閮借繃涓嶄簡锛?/h3>
鈥?strong>鈥嬫浜℃渚嬧€?/strong>鈥嬶細
涓婂懆缇ゅ弸灏忔槑鎯宠嚜瀹氫箟UIView鍒濆鍖栵紝缁撴灉...
swift澶嶅埗// 鐖剁被澹版槑 init(frame: CGRect, themeColor: UIColor) // 浣滄鍐欐硶 override init(frame: CGRect) { // 鉂?鍙傛暟鏁伴噺涓嶅 super.init(frame: frame) }
鈥?strong>鈥嬬郴缁熸毚鎬掆€?/strong>鈥嬶細
'Super.init' isn't called on all paths before returning from initializer
鈥?strong>鈥嬬牬瑙d箣閬撯€?/strong>鈥嬶細
鈻?鎸変綇Command鐐规柟娉曞悕鐪嬬埗绫诲0鏄?br/>
鈻?浣跨敤Xcode鑷姩琛ュ叏锛堣緭鍏verride鍚庢寜鍥炶溅锛?/p>
馃尓 鍦烘櫙涓夛細鎵嬭幢閲嶅啓绉佹湁鏂规硶锛堣繍琛屾椂宕╂簝锛?/h3>
鈥?strong>鈥嬬伒寮傜幇鍦衡€?/strong>鈥嬶細
"鎴戝氨鎯虫敼涓寜閽鑹诧紝鎬庝箞鍚姩灏卞穿锛?
swift澶嶅埗// 閿欒灏濊瘯閲嶅啓绉佹湁鏂规硶 override func _updateButtonStyle() { // 鉂?甯︿笅鍒掔嚎鐨勬柟娉曞緢鍗遍櫓锛?/span> // 浣犵殑榄旀敼浠g爜 }
鈥?strong>鈥嬪嵄闄╀俊鍙封€?/strong>鈥嬶細
鈻讹笍 宕╂簝淇℃伅鍚?NSInvalidArgumentException"
鈻讹笍 鎺у埗鍙版彁绀簎nrecognized selector sent to instance
鈥?strong>鈥嬩繚鍛芥妧宸р€?/strong>鈥嬶細
- 鐢╮espondsToSelector妫€鏌ユ柟娉曟槸鍚﹀瓨鍦?/li>
- 瀹樻柟鏂囨。娌″啓鐨勬柟娉曞埆纰?/li>
- 浣跨敤Method Swizzling瑕佷笁鎬?/li>
馃挘 鍦烘櫙鍥涳細绾跨▼闂寮曞彂UI閿欎贡锛堟渶闅炬煡鐨勫潙锛?/h3>
鈥?strong>鈥嬬湡瀹炶妗堚€?/strong>鈥嬶細
鏌愮數鍟咥pp鍟嗗搧椤电獊鐒剁櫧灞忥紝绔熸槸閲嶅啓layoutSubviews鏃?..
swift澶嶅埗override func layoutSubviews() { DispatchQueue.global().async { // 鉂?鍦ㄥ悗鍙扮嚎绋嬫搷浣淯I self.button.frame = CGRect(x: 0, y: 0, width: 100, height: 40) } }
鈥?strong>鈥嬪穿婧冭寰嬧€?/strong>鈥嬶細
鈻讹笍 10娆¤繍琛?娆℃甯革紝7娆″穿婧?br/>
鈻讹笍 鎶ラ敊鍚?Main Thread Checker"
鈥?strong>鈥嬬嚎绋嬪畨鍏ㄦ墜鍐屸€?/strong>鈥嬶細
swift澶嶅埗override func layoutSubviews() { super.layoutSubviews() DispatchQueue.main.async { // 鉁?涓荤嚎绋嬫姢浣?/span> // UI鎿嶄綔鏀捐繖閲?/span> } }
馃毃 鍦烘櫙浜旓細璁块棶鏉冮檺瓒婃敼瓒婂皬锛堢紪璇戞湡鍩嬮浄锛?/h3>
鈥?strong>鈥嬫潈闄愮伨闅锯€?/strong>鈥嬶細
鎯抽檺鍒跺閮ㄨ闂紝缁撴灉...
swift澶嶅埗// 鐖剁被澹版槑 open func calculateSize() -> CGSize // 浣滄閲嶅啓 override private func calculateSize() -> CGSize { // 鉂?璁块棶鏉冮檺浠巓pen闄嶇骇 return CGSize(width: 100, height: 100) }
鈥?strong>鈥嬬紪璇戝櫒鎬掑惣鈥?/strong>鈥嬶細
Cannot override a non-open declaration with an open one
鈥?strong>鈥嬫潈闄愬鐓ц〃鈥?/strong>鈥嬶細
鐖剁被鏉冮檺 | 鍚堟硶瀛愮被鏉冮檺 |
---|---|
open | open, public |
public | public, internal |
internal | internal, fileprivate |
馃洜 缁堟瀬璋冭瘯宸ュ叿绠憋紙3骞磋俯鍧戠粡楠岋級
閬囧埌宕╂簝鍒厡锛屾寜杩欎釜娴佺▼鎺掓煡锛?br/>
1锔忊儯 鐪嬪穿婧冨爢鏍堢涓€涓嚜瀹朵唬鐮侊紙閲嶇偣妫€鏌verride鏂规硶锛?br/>
2锔忊儯 妫€鏌ユ帶鍒跺彴鏄惁鏈?override"鐩稿叧璀﹀憡
3锔忊儯 瀵规瘮鐖剁被鏂规硶澹版槑锛堝弬鏁般€佽繑鍥炲€笺€佽闂潈闄愶級
4锔忊儯 娉ㄩ噴娉曪細閫愪釜娉ㄩ噴鏂板浠g爜瀹氫綅闂鐐?/p>
鈥?strong>鈥嬪喎鐭ヨ瘑鈥?/strong>鈥嬶細Swift缂栬瘧鍣ㄥoverride鐨勬鏌ユ瘮Objective-C涓ユ牸3鍊嶏紒杩欐槸濂戒簨涔熸槸鍧忎簨锛屼綘缁嗗搧...
鏈€鍚庤涓墡蹇冪湡鐩革細缇ら噷缁熻鏄剧ず锛屸€?strong>鈥?8%鐨刼verride鐩稿叧宕╂簝鍏跺疄閮借兘琚玐code鎻愬墠棰勮鈥?/strong>鈥嬶紝鍙槸寰堝浜哄拷鐣ヤ簡榛勮壊璀﹀憡鈿狅笍銆傚吇鎴愭瘡澶╂竻鐞嗚鍛婄殑濂戒範鎯紝鑳借浣犲皯鍔?灏忔椂鐝紒