在Objective-C的Category中使用属性的懒加载

@interface VC (Pay)
@property (nonatomic, strong) PayView *choiceView;
@end

两种写法:
1,使用指针

#import 

static void *choiceViewKey = &choiceViewKey;
@implementation VC (Pay)
- (PayTypeView *)choiceView {
    PayTypeView *choiceView = objc_getAssociatedObject(self, choiceViewKey);
    if (!choiceView) {
         choiceView = [[NSBundle mainBundle] loadNibNamed:@"PayTypeView" owner:nil options:nil].firstObject;
                choiceView.frame = self.view.window.frame;
                [choiceView.alipayTap addTarget:self action:@selector(alipayAction)];
                [choiceView.wechatPayTap addTarget:self action:@selector(wechatAction)];
        objc_setAssociatedObject(self, choiceViewKey, choiceView, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }
    
    return choiceView;
}
- (void)setChoiceView:(PayTypeView *)choiceView {
     objc_setAssociatedObject(self, choiceViewKey, choiceView, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

@end

2,使用@selector()

#import 

@implementation VC (Pay)
- (PayView *)choiceView {
    PayView *choiceView = (PayView *)objc_getAssociatedObject(self, @selector(choiceView));
    if (!choiceView) {
        choiceView = [[NSBundle mainBundle] loadNibNamed:@"PayView" owner:nil options:nil].firstObject;
        choiceView.frame = self.view.window.frame;
        [choiceView.alipayTap addTarget:self action:@selector(pay)];
        objc_setAssociatedObject(self, @selector(choiceView), choiceView, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }
    return choiceView;
}
@end
- (void)setChoiceView:(PayView *)choiceView {
    objc_setAssociatedObject(self, @selector(choiceView), choiceView, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

注意:

  • 对于普通的OC对象, 通常采用OBJC_ASSOCIATION_RETAIN_NONATOMIC.
  • 对于NSString等通常采用copy关键字的属性, 通常采用OBJC_ASSOCIATION_COPY_NONATOMIC.
  • 对于枚举等通常采用assign关键字的属性, 通常采用OBJC_ASSOCIATION_ASSIGN.

参考:

在Objective-C的Category中使用属性的懒加载

另外:
在Category的.m中,写一个类的声明,重写一个同名属性,可以使用VC中的属性,这样也不需要再另外写getter/setter方法。

vc的.m中

@interface VC () 
@property (copy, nonatomic) NSString * price;
@end

vc的Category的.m中

@interface VC () 
@property (copy, nonatomic) NSString * price;
@end
@implementation VC (Pay)
- (void)payWithPrice:(NSString *)price completion:(PayBlock)completion {
    self.price = price;
}
@end

你可能感兴趣的:(在Objective-C的Category中使用属性的懒加载)