详解iOS开发在Category和Protocol中添加属性(Property)

对于iOS开发者来说,相信大家对于Category 和 Protocol 肯定不会陌生,我们实际开发过程中100%会用到,但是在它们中添加和使用Property,你们真的非常熟悉吗?下面笔者就给大家梳理一下在Category和Protocol中添加和使用Property的知识。

1.什么是property?

中文翻译:合成存取器
@property的书写格式

@property (修饰列表) 变量类型 变量名;
  • Xcode4.4之前
    @property使编译器自动生成set/get方法声明。
    @synthesize自动生成set/get方法的实现
    @synthesize还会自动生成私有成员变量
  • Xcode4.4以后
    不用再写@synthesize,编译器通过@property就能给我们生成set/get方法的声明和实现,默认生成成员变量:_propertyName
    用@property生成的成员变量是私有的。
    当我们想改变默认的成员变量名时,@synthesize age = newName;
    如果子类想访问父类的成员变量,
    1、通过set/get方法
    2、显式地声明成员变量

2.关于protocol中的property

在protocol中添加property时,其实就是声明了 getter和setter方法,在实现这个protocol协议的类中,我们要自己手动添加实例变量,并且需要实现setter/getter方法。
伪代码:
main.m

1 Student *student = [[Student alloc] init];
2         
3 student.name = @"Liming";
4         
5 NSLog(@"%@", student.name);

person.h
设置协议,与其中的property

#import <Foundation/Foundation.h>

@protocol personDelegate <NSObject>

@property (nonatomic, copy) NSString *name;

@end

@interface Person : NSObject

@end

student.h
生成成员变量, _name

#import <Foundation/Foundation.h>
#import "Person.h"

@interface Student : NSObject <personDelegate>
{
    //***声明成员变量***
     NSString *_name;
}
@end

student.m
这里写了两种方法,一种是自动实现setter/gerter,一种为手动setter/gerter

#import "Student.h"

@implementation Student

//------------------自动----------------------//
//@synthesize
//
//编译器期间,让编译器自动生成getter/setter方法。
//
//当有自定义的存或取方法时,自定义会屏蔽自动生成该方法

//自动生成setter/getter方法

//@synthesize name;



//------------------手动----------------------//

//@dynamic
//
//告诉编译器,不自动生成getter/setter方法,避免编译期间产生警告
//
//然后由自己实现存取方法

//实现Person中定义的属性name的set方法
- (void)setName:(NSString *)name {
    _name = name;

}

//实现Person中定义的属性name的get方法
- (NSString *)name {
    return _name;
}

@end

3.category中的property

在category中添加方法大家都很熟悉, 但是如何在category中添加成员变量呢?

1) 使用临时全局变量来替代成员变量

首先声明:Person没有name属性
main.m
导入头文件:
#import “Person+Extension.h”

 Person *person = [[Person alloc] init];        
 person.name = @"peng";         
 NSLog(@"%@", person.name);

Person+Extension.h

#import "Person.h"

@interface Person (Extension)

@property (nonatomic, strong) NSString *name;

@end

Person+Extension.m

#import "Person+Extension.h"
#import <objc/runtime.h>

//***临时变量***
static NSString *_name;

@implementation Person (Extension)

- (void)setName:(NSString *)name {
    _name = name;
}

- (NSString *)name {
    return _name;
}
@end
2) 使用runtime关联对象实现成员变量

除了Person+Extension.m以外其他代码与第一种方法相同
Person+Extension.m

@implementation Person (Extension)

- (void)setName:(NSString *)name{
 
	objc_setAssociatedObject(self,@selector(name),name,OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    
}

- (NSString *)name{

	NSString *n = objc_getAssociatedObject(self, @selector(name));
    return n;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值