@whiteiOS
2017-04-10T03:02:57.000000Z
字数 1513
阅读 2227
iOS学习之路
在protocol中使用property时,只会生成setter和getter方法的声明,而在遵守该协议的类中,要手动添加实例变量,并且需要实现setter和getter方法
代码示例:
Person.h
//设置协议,添加property#import <Foundation/Foundation.h>@protocol personDelegate <NSObject>@property (nonatomic, copy) NSString *name;@end@interface Person : NSObject@end
Student.h
//遵守Person的协议,并声明实例变量#import <Foundation/Foundation.h>#import "Person.h"@interface Student : NSObject <personDelegate>{NSString *_name;}@end
Student.m
//实现setter和getter//有两种方法:自动实现和手动实现//------------------自动----------------------//@implementation Student@synthesize name;@end//------------------手动----------------------//@implementation Student- (void)setName:(NSString *)name{_name = name;}- (NSString *)name{return _name;}@end
ViewController.m
- (void)viewDidLoad {[super viewDidLoad];Student *s = [[Student alloc] init];s.name = @"123";NSLog(@"%@", s.name);}
打印正确
objc_setAssociatedObject和objc_getAssociatedObjectNSObject+Extension.h
@interface NSObject (Extension)@property NSString *name;@end
NSObject+Extension.m
@implementation NSObject (Extension)- (void)setName:(NSString *)name{//参数一:给谁添加属性//参数二:属性名称//参数三:属性值//参数四:保存策略objc_setAssociatedObject(self, @"name", name, OBJC_ASSOCIATION_RETAIN_NONATOMIC);}- (NSString *)name{return objc_getAssociatedObject(self, @"name");}@end
ViewController.m
- (void)viewDidLoad {[super viewDidLoad];NSObject *objc = [[NSObject alloc] init];objc.name = @"123";NSLog(@"%@", objc.name);}