如何在iOS UITableViewController中初始化属性

时间:2013-11-25 19:57:23

标签: ios objective-c initialization lazy-initialization

我正在处理UITableViewController

@interface GinkgoDeliveryOrdersTableViewController : UITableViewController

@property PFQuery * query;
@property NSArray * products;

@end

我该如何初始化这两个属性?目前,我正在进行延迟初始化:

@implementation GinkgoDeliveryOrdersTableViewController

@synthesize query = _query;
@synthesize products = _products;

- (void) initQuery {
    _query = [PFQuery queryWithClassName:@"_Product"];
}

- (void) initProducts {
    if(! _query)
        [self initQuery];
    _products = [_query findObjects];
}

因此,每次我想使用这两个属性时,我都必须这样做:

if(! self.products)
        [self initProducts];

if(! self.query)
        [self initQuery];

我觉得我在这里做错了什么。有更清洁的方法吗? 非常感谢你!

2 个答案:

答案 0 :(得分:6)

如果未从外部设置值,则它们不应是读/写属性。将它们设为只读并在“getter”方法中使用延迟加载。

@interface GinkgoDeliveryOrdersTableViewController : UITableViewController

@property (nonatomic, readonly) PFQuery * query;
@property (nonatomic, readonly) NSArray * products;

@end


@implementation GinkgoDeliveryOrdersTableViewController

@synthesize query = _query;
@synthesize products = _products;

- (PFQuery *)query {
    if (!_query) {
        _query = ...
    }

    return _query;
}

products getter做同样的事。

请注意,在原始代码中不需要@synthesize行,但在此更新的代码中需要它们,因为否则由于显式的getter方法而无法自动生成ivar。

答案 1 :(得分:4)

当您创建@property时,编译器会自动为您创建setter和getter。

// Let's say you create a public property in your header file (.h)
@property NSObject *var;

// You synthesize your property in your implementation file (.m)
@synthesize var = _var;

// What does the compiler creates for you?
// A getter that by default has the same name as your variable 
- (NSObject *)var
{
    return _var;
}

// A setter that by default is called "set" + "Var" (your variable name with first letter in uppercase)
- (void)setVar:(NSObject *)var
{
    _var = var;
}

Lazy instantiation是一种设计模式,您可以选择等到最后一刻来实例化对象。所以,在你的情况下,它将在getter。当有人试图读取尚未使用的属性时,是时候实例化它们了:D

这就是我想你想要的:D

// GinkgoDeliveryOrdersTableViewController.h
@interface GinkgoDeliveryOrdersTableViewController : UITableViewController

@property PFQuery *query;
@property NSArray *products;

@end

// GinkgoDeliveryOrdersTableViewController.m
@implementation GinkgoDeliveryOrdersTableViewController

@synthesize query = _query;
@synthesize products = _products;

// SETTERS
- (void)setQuery:(PFQuery *)query {
    _query = query;
}

- (void)setQuery:(NSArray *)products {
    _products = array;
}

// GETTERS
- (PFQuery *)query {
    if (!_query)
        _query = [PFQuery queryWithClassName:@"_Product"];

    return _query;
}

- (NSArray *)products {
    if (!_products)
        _products = [_query findObjects];

    return _products;
}
    对于基本类型,
  • @synthesize分配变量所需的空间。
  • @synthesize指向对象的指针仅分配指针所需的空间。您必须分配并初始化您的财产。
  • 请勿在setter和getter之外使用_var。请改用self.var。
  • 您可以更改setter和getter的默认名称

@property (nonatomic, strong, setter=setVariable:, getter=getVariable) NSObject *var;

  • rmaddy有完美的答案......但是我已经把我当作草案保存了......下次我会更快回答......