2013-11-25 26 views
4

我在UITableViewController如何在iOS中的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]; 

我覺得我在這裏做錯了事。是否有一個更清潔的方式做到這一點? 非常感謝!

回答

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吸氣劑做同樣的操作。

請注意,在您的原始代碼中,不需要@synthesize行,但在此更新的代碼中,它們是必需的,否則由於明確的getter方法,ivar不會自動生成。

4

當您創建@property時,編譯器自動爲您創建setter和getters。

// 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; 
} 

延遲實例化是一種設計模式,您選擇等待實例化對象的最後時刻。所以,在你的情況下,它將在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。
  • 你可以爲你的setter更改默認名稱和getter

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

  • rmaddy有完美的答案...但我有我已經保存爲草稿...我會下次更快回答...
+0

非常感謝!我學到了很多! – Ra1nWarden