IOS开发笔记 ——@dynamic 和 @synthesize 和区别
2015-10-04 16:42
375 查看
@dynamic 和 @synthesize 和区别
当我们设置一个类的变量的时候,我们会考虑设置属性,也就是@property ,当我们设置玩属性后,我们要实现它的 get 和 set 方法,但是现在的编译器默认已经帮我们实现好了,也就是我们@synthesize。
@synthesize 的作用就是帮我们实现 get 和 set 方法,如下
而 @ dynamic 表示这个成员变量的 getter 和 setter 方法并不是直接由编译器生成,而是手工生成或者运行时生成。
这就是 @dynamic 的作用,那么我们该怎么运用运行时来生成 get 和 set 方法呢?以下是我给出的例子
当我们设置一个类的变量的时候,我们会考虑设置属性,也就是@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]; } }
相关文章推荐
- iOS应用如何防止被反编译
- ios -- cell的图片下载
- IOS 读取文件
- IOS 写出文件
- iOS8互动的新通知
- iOS调用系统照相机和闪光灯功能
- ios 单例模式(懒汉式)
- BIOS入门之我见-输入
- BIOS入门之我见-界面
- BIOS入门之我见-布局
- iOS_NSAttributeString
- BIOS入门之我见-预热
- BIOS入门之我见-开篇
- ios-技术总结
- iOS和OSX的核心
- IOS中的字典转模型
- iOS开发——性能优化的25个建议和技巧
- iOS 错误: [NSNull length]: unrecognized selector sent to instance 0x110504af0'
- iOS讲解迷惑深入浅出之block那点事
- iOS开发 —— MVVM设计模式