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

IOS开发笔记 ——@dynamic 和 @synthesize 和区别

2015-10-04 16:42 375 查看
@dynamic 和 @synthesize 和区别

当我们设置一个类的变量的时候,我们会考虑设置属性,也就是@property ,当我们设置玩属性后,我们要实现它的 get 和 set 方法,但是现在的编译器默认已经帮我们实现好了,也就是我们@synthesize。

@synthesize 的作用就是帮我们实现 get 和 set 方法,如下

@property (nonatomic,copy) NSString *author;

// set
- (void)setAuthor:(NSString *)author {
[_author release];
[author retain];
_author = author
}

// get
- (NSString *)author {
return _author;
}


而 @ dynamic 表示这个成员变量的 getter 和 setter 方法并不是直接由编译器生成,而是手工生成或者运行时生成。

这就是 @dynamic 的作用,那么我们该怎么运用运行时来生成 get 和 set 方法呢?以下是我给出的例子

#import <Foundation/Foundation.h>
@interface Book : NSObject
{
NSMutableDictionary *data;
}
@property (nonatomic,copy) NSString *title; // 书名
@property (nonatomic,copy) NSString *author; // 作者
@end

@implementation Book

// @ dynamic 表示这个成员变量的 getter 和 setter 方法并不是直接由编译器生成,而是手工生成或者运行时生成。
@dynamic title;
@dynamic author;

- (void)dealloc {
TT_RELEASE_SAFELY(data)
TT_RELEASE_SAFELY(self.title)
TT_RELEASE_SAFELY(self.author)
}

- (instancetype)init {
if (self = [super init ]) {
data = [[NSMutableDictionary alloc]init];
[data setObject:@"Tom Sawyer" forKey:@"title"];
[data setObject:@"Mark Twain" forKey:@"author"];
}
return self;
}

- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector {
NSString *selector = NSStringFromSelector(aSelector);
if ([selector hasPrefix:@"set"]) {
// c 类型的 set 方法
return [NSMethodSignature signatureWithObjCTypes:"v@:@"];
}else {
// c 类型的 get 方法
return [NSMethodSignature signatureWithObjCTypes:"@@:"];
}
}

- (void)forwardInvocation:(NSInvocation *)anInvocation {
NSString *key = NSStringFromSelector([anInvocation selector]);
if ([key hasPrefix:@"set"] ) { // 判断是否为 set 方法
// 除去 set 以后,拿到属性的小写全称
key = [[key substringWithRange:NSMakeRange(3, [key length]-4)] lowercaseString];
NSString *obj;
// 修改 obj 的地址来存储 set 值
[anInvocation getArgument:&obj atIndex:2];
// 修改 collection 对象的值
[data setObject:obj forKey:key];
} else {
NSString *obj = [data objectForKey:key];
[anInvocation setReturnValue:&obj];
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: