您的位置:首页 > 移动开发 > IOS开发

IOS开发笔记之二十七——一个@dynamic导致的crash问题

2015-06-03 11:39 525 查看
1、最近好好的工程代码突然冒出一个crash的bug,A类的crash日志如下:

2015-06-03 11:42:53.807 DPScope[86379:1639651] -[A setTitleCell:]: unrecognized selector sent to instance 0x7fd5fe7d0400
2015-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 + 165
1   libobjc.A.dylib                     0x0000000111e9abb7 objc_exception_throw + 45
2   CoreFoundation                      0x000000011220b0ad -[NSObject(NSObject) doesNotRecognizeSelector:] + 205
3   CoreFoundation                      0x000000011216113c ___forwarding___ + 988
4   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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: