1、最近好好的工程代碼突然冒出一個crash的bug,A類的crash日誌如下:
2015-06-03 11:42:53.807 DPScope[86379:1639651] -[A setTitleCell:]: unrecognized selector sent to instance 0x7fd5fe7d04002015-06-03 11:42:53.815 DPScope[86379:1639651] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[A setTitleCell:]: unrecognized selector sent to instance 0x7fd5fe7d0400'*** First throw call stack:(0 CoreFoundation 0x0000000112203c65 __exceptionPreprocess + 1651 libobjc.A.dylib 0x0000000111e9abb7 objc_exception_throw + 452 CoreFoundation 0x000000011220b0ad -[NSObject(NSObject) doesNotRecognizeSelector:] + 2053 CoreFoundation 0x000000011216113c ___forwarding___ + 9884 CoreFoundation 0x0000000112160cd8 _CF_forwarding_prep_0 + 120
crash日誌的大致意思就是找不到 setTitleCell這個方法;
而titleCell是A類的一個cell屬性,
@property (nonatomic,strong)TitleCell *titleCell;
後來發現,這個titleCell屬性在實現時,被人聲明為以下:
@implementation A@dynamic titleCell;
注釋掉這行代碼,就不會再crash。
2、@dynamic關鍵字與@synthesize關鍵字的用法
當一個@property的屬性被@synthesize修飾時,意味著如果你沒有手動實現屬性的setter方法和getter方法,那麼編譯器酒會自動為你產生它們;
當一個@property的屬性唄@dynamic修飾時,就意味著屬性的getter與setter方法需要由使用者自己實現,不會自動產生。如果你沒有手動提供setter或者getter方法,那麼編譯時間沒問題,但是在程式運行類似self.titleCell= [TitleCell new]或者TitleCell *cell = self.titleCell時,就會因為缺少setter方法和getter方法而crash。編譯沒問題,運行時才會執行相應的方法,就是所謂的動態綁定機制。
當然,如果你們沒有顯示聲明它們,預設就是@syntheszie方式;
3、參考連結
http://blog.csdn.net/haishu_zheng/article/details/12873151