@dynamic和@synthsize
2020-10-15 本文已影响0人
Sweet丶
一、使用上的区别
@synthesize age = _age; // 这个是默认的写法
@dynamic age; // 使用@peoperty时希望自己手动实现setter、getter、成员变量时的写法
@synthesize和@dynamic是不能同时使用的。
@synthesize age = _age;的作用是让编译器自动生成与属性age
对应的成员变量_age
, 同时自动生成setter
和getter
方法的实现。
@dynamic age; 是让编译器不生成setter
和getter
方法的实现, 也不生成与@property对应的成员变量;使用时,即使没有手动实现setter
和getter
在编译期间也不会报错,在运行时会奔溃,找不到方法。
解决:
- 可以手动实现
setter
和getter
; - 在动态方法解析方法里面添加对应的实现,如下:
+ (BOOL) resolveInstanceMethod:(SEL)sel
{
// Capture setName: and name method
if (sel == @selector(setName:)) {
class_addMethod([self class], sel, (IMP)setName, "v@:@");
return YES;
}
else if (sel == @selector(name)) {
class_addMethod([self class], sel, (IMP)getName, "@@:");
return YES;
}
return [super resolveInstanceMethod:sel];
}
void setName(id self, SEL _cmd, NSString* name)
{
// Implement @property (copy)
if (((Person *)self)->_name != name) {
[((Person *)self)->_name release];
((Person *)self)->_name = [name copy];
}
}
NSString* getName(id self, SEL _cmd)
{
return ((Person *)self)->_name;
}
二、使用时候的报错
-
@peoperty声明了属性,在.m文件中同时重写了setter和getter,会报错。解决方法:手动加上@synthesize age = _age;
-
@peoperty声明了属性,在.m文件中使用@dynamic age; , 在运行时奔溃,原因上面已经讲过。