几个常用宏

懒加载宏

在创建各种子视图时,我们习惯将这些子视图定义为对象属性,然后通过属性的获取(getter)方法实现子视图的懒加载。比如在控制器中我们需要创建一个自定会的子视图,经常会这样写:

- (UIView *)wrapperView {
    if (!_wrapperView) {
        _wrapperView = [[CustomView alloc] init];
    }
    return _wrapperView;
}

当需要创建多个自定义的子视图时,就需要重复写类似代码,我们可以通过定义一个宏来实现懒加载。

#ifndef JKLazyLoading
#define JKLazyLoading(_type_, _ivar_) \
- (_type_ *)_ivar_ { \
    if (! _##_ivar_) { \
        _##_ivar_ = [[_type_ alloc] init]; \
    } \
    return _##_ivar_; \
}
#endif

相应的上面通过宏可以如下调用:

JKLazyLoading(UIView, wrapperView)

self弱引用和强引用

在使用block时候,容易引起循环引用问题,为了打破循环引用,我们经常在进入block前先对self做一个弱引用,在block里为防止引用的弱self释放,进而对该弱引用的对象做一个强引用,如下:

    __weak __typeof(self) weak_self = self;
    [self doSomething:^{
        __typeof(self) strong_self = weak_self;
        ...
    }];

为了简化上面代码的书写,可以定义如下宏,

#ifndef weakify
    #if DEBUG
        #if __has_feature(objc_arc)
        #define weakify(object) autoreleasepool{} __weak __typeof__(object) weak##_##object = object;
        #else
        #define weakify(object) autoreleasepool{} __block __typeof__(object) block##_##object = object;
        #endif
    #else
        #if __has_feature(objc_arc)
        #define weakify(object) try{} @finally{} {} __weak __typeof__(object) weak##_##object = object;
        #else
        #define weakify(object) try{} @finally{} {} __block __typeof__(object) block##_##object = object;
        #endif
    #endif
#endif

#ifndef strongify
    #if DEBUG
        #if __has_feature(objc_arc)
        #define strongify(object) autoreleasepool{} __typeof__(object) object = weak##_##object;
        #else
        #define strongify(object) autoreleasepool{} __typeof__(object) object = block##_##object;
        #endif
    #else
        #if __has_feature(objc_arc)
        #define strongify(object) try{} @finally{} __typeof__(object) object = weak##_##object;
        #else
        #define strongify(object) try{} @finally{} __typeof__(object) object = block##_##object;
        #endif
    #endif
#endif

通过这个宏,上面代码可以简写为:

@weakify(self)
[self doSomething:^{
    @strongify(self)
        ...
}];

关联对象宏

有时候我们会通过关联对象的方式为已有类添加属性,为避免记忆这些API的使用方式,这里给出一组宏可以简化动态属性的实现方式:

#ifndef JKDynamicProperty
#define JKDynamicProperty(_getter_, _setter_, _association_, _type_) \
- (void)_setter_ : (_type_ *)object { \
    [self willChangeValueForKey:@#_getter_]; \
    objc_setAssociatedObject(self, _cmd, object, OBJC_ASSOCIATION_ ## _association_); \
    [self didChangeValueForKey:@#_getter_]; \
} \
- (_type_ *)_getter_ { \
    return objc_getAssociatedObject(self, @selector(_setter_:)); \
}
#endif

按照如下方式使用该宏:

JKDynamicProperty(propetyName, setPropertyName, RETAIN_NONATOMIC, PropertyClass);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Excel VBA常用下载是指在Excel中使用VBA编写的代码,用于自动执行一系列的操作。下面将介绍三个常用代码。 首先,常用代码是用于自动筛选数据的。我们可以通过编写代码,实现根据指定条件对数据进行筛选。例如,我们可以编写一个代码,使得只显示满足某一条件的数据,从而快速找到我们需要的信息。 其次,常用代码是用于自动运算的。我们可以编写代码来执行一些常见的运算操作,比如求和、平均值等。通过编写代码,可以简化我们对数据进行统计和运算的过程,提高工作效率。 最后,常用代码是用于自动排列和格式化表格的。我们可以编写代码来自动调整表格的布局和格式,使之更加美观和易读。例如,我们可以编写一个代码,将数据按照指定的规则排序,并自动添加边框和颜色。 总之,Excel VBA常用下载是为了提高我们在Excel中的工作效率而编写的一系列自动化代码。通过编写这些代码,可以简化我们的操作流程,节省时间,提高效率。 ### 回答2: 在Excel VBA中,是指一系列的命令和操作的集合,可以用于自动化完成特定的任务或提供更方便的功能。在Excel中下载常用的方法有以下几种: 1. 通过录制下载:在Excel中,我们可以通过录制的方式来记录下我们的操作步骤,然后保存为VBA代码。录制的方法是点击“开发工具”选项卡中的“”按钮,之后按照提示进行操作即可。录制完后,我们可以将保存下来并在以后需要的时候运行。 2. 通过VBA编辑器下载:VBA编辑器是Excel中编写和编辑VBA代码的工具。我们可以通过“开发工具”选项卡中的“Visual Basic”按钮或按下“Alt+F11”快捷键来打开VBA编辑器。在VBA编辑器中,我们可以创建新的模块,并在模块中编写下载所需的代码。 3. 通过导入文件下载:我们可以从其他来源下载文件,并将其导入到Excel中。导入文件的方法是打开VBA编辑器,然后选择“文件”菜单中的“导入文件”,在弹出的对话框中选择文件并点击“打开”。导入后,我们就可以在Excel中使用这个了。 此外,我们还可以通过自定义快捷键或在Excel中添加按钮来运行下载的。为了更好地使用功能,我们需要熟悉VBA语言的基本知识和常见代码。可以通过学习相关的教程、参考手册或在线资源来提高编写、修改和运行的能力。最后,为了确保的安全性,我们应该只下载和运行可信的文件,并注意避免下载和运行未知来源的文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值