我正在处理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];
我觉得我在这里做错了什么。有更清洁的方法吗? 非常感谢你!
答案 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
指向对象的指针仅分配指针所需的空间。您必须分配并初始化您的财产。_var
。请改用self.var。 @property (nonatomic, strong, setter=setVariable:, getter=getVariable) NSObject *var;