LazyProperty 1.1.0

LazyProperty 1.1.0

测试已测试
Lang语言 Obj-CObjective C
许可证 MIT
发布最新版本2014年12月

Nicolas Goutaland 维护。



  • 作者:
  • nicolasgoutaland

一行语句实现懒加载属性定义,具有自动触发和自定义选择器功能

仅支持 ARC,XCode 4.4 及以上版本(用于自动合成属性)

描述

处理懒加载属性有时可能很繁琐,需要反复复制粘贴相同代码。
这在阅读源文件时可能会造成困扰。
有时,您在属性初始化时必须执行一些代码。

更多关于懒实例化的信息,请参阅维基百科:懒实例化

使用

  • 声明一个 strong nonatomic 属性用于对象类型
    • @property (nonatomic, strong)
  • 在文件末尾添加以下宏之一,指定属性名称,在类实现 @end 之前:
    • LAZY_PROPERTY(propertyName)
    • LAZY_PROPERTY_CUSTOM_SELECTOR(propertyName, @selector(customSelectorName:), @[@"parameter"])
  • 可选声明自动触发的函数。自动触发的函数名为属性名称,驼峰式命名,前缀为 configure
    • - (void)configurePropertyName ...
  • 触发方法可以接受一个可选参数,即 LAZY_PROPERTY_CUSTOM_SELECTOR 宏的对象参数。
    • - (void)configurePropertyName:(MyParameter *)aParameter ...

示例

RootViewController.m

@interface DemoViewController ()
...

// Lazy properties
@property (nonatomic, strong) SimpleViewController *simpleViewController; // Will be used modally
@property (nonatomic, strong) DetailViewController *detailViewController; // Will be pushed from tableview
@end

@implementation DemoViewController
...

#pragma mark - UITableViewDelegate methods
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    // No need to worry about detail view controller instantiation. It will be created at first call
    // This allows you to keep your code super clear
    [self.navigationController pushViewController:self.detailViewController
                                         animated:YES];
}

#pragma mark - UIActions
- (IBAction)showModal:(id)sender
{
    // No need to worry about view controller instantiation here too. It will be created at first call
    // First configuration was moved to a dedicated method, auto triggered on object creation
    [self presentViewController:self.simpleViewController
                       animated:YES
                     completion:nil];
}

#pragma mark - Configuration methods
// This method will be autotriggered when simpleViewController will be instantiated
- (void)configureSimpleViewController
{
    // This methods will be called only once, so you can perform initial configuration here
    _simpleViewController.backgroundColor = [UIColor redcolor];
}

// Magic happens here. Write macros at the end of the file, to keep it clean. Use property name
LAZY_PROPERTY(simpleViewController);
LAZY_PROPERTY(detailViewController);
@end

在提供的示例中可以找到更多示例,例如使用自定义选择器。

用例

  • 要模态显示的视图控制器
  • 当选中表格视图中的一行后要 pushing 的视图控制器,用于显示详细信息
  • 与类关联的 NSMutableDictionaryUserInfo
  • 在详细视图控制器中使用的 MoviePlayer,在初始化时需要自定义
  • 无限延伸

如果您有其他用例,请告诉我

优势

  • 减少输入,做更多
  • 减少编码量
  • 专注于逻辑/业务代码而不是内存管理
  • 将配置代码与工作流程代码分开
  • 用更少的代码行实现繁琐的初始化
  • 减少内存占用,不分配未使用的对象

注意事项

  • 请注意,特别是对于 UI 对象,因为初始化将在调用线程上执行
  • 生成的 ivar 将保持 nil 直到首次访问属性
  • 您可以直接访问生成的 ivar (_propertyName),而无需触发初始化
  • init 构造函数默认使用
  • 不要在你的代码中添加 @synthesize
  • 不要声明 ivar

限制

只支持 strong 属性。延迟 weak 属性可能在每次调用时实例化一个新实例。《strong》属性不支持。当重写 atomic 属性时,你必须重写获取器和设置器。在原子属性上使用 LazyProperty 会导致编译器警告信息。

安装

Cocoapods: pod 'LazyProperty'
手动: 将项目中的 Classes 文件夹复制

在你的项目中导入头文件。.pch 是一个好位置 ;)

#import "LazyProperty.h"

版本

1.0 : 初始版本 1.1 : 添加了一些测试,触发方法可以有一个参数,从生成的获取器中移除了 @synchronized

团队

Nicolas Goutaland