如果我有一个UITableViewController类,我在哪里初始化它的实例变量?

时间:2013-03-19 18:19:22

标签: ios objective-c xcode ios5 ios6

如果我把它放在viewDidLoad中,它会起作用,但我无法想象这是最好的地方。我试着把它放在这里:

- (id)initWithStyle:(UITableViewStyle)style
{
    self = [super initWithStyle:style];
    if (self) {
        // HERE
    }
    return self;
}

但那没用。我应该把它放在哪里?

在这个例子中,我正在谈论为这个类创建NSMutableArray(为其分配和启动它)。

3 个答案:

答案 0 :(得分:1)

您有4种初始化方法:

- (id)init
- (id)initWithCoder:(NSCoder *)aDecoder 
- (id)initWithStyle:(UITableViewStyle)style
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

这完全取决于你如何实例化这个类。

答案 1 :(得分:1)

您可以使用延迟加载技术,如评论中的A-Live建议,这样您的数组将在您实际需要时进行初始化。我们的想法是,在属性获取器中,首先检查您的阵列是否已初始化。如果没有,请初始化然后返回。

示例

  

注意:这是一个原始且未经测试的示例,您可能需要进行此操作   必要的更改取决于您是否使用ARC。

<强> MyViewController.h

@interface MyViewController : UITableViewController
{
    NSArray *_myArray;
}
@property (nonatomic, readonly) NSArray *myArray;
-(void)doSomething;
@end

<强> MyViewController.m

@interface MyViewController()
-(NSArray *)fetchArrayData;
@end

@implementation MyViewController

@synthesize myArray = _myArray;

#pragma mark - Property Getter
-(NSArray *)myArray
{
    if (_myArray==nil)
        _myArray = [[self fetchArrayData] retain];
    return _myArray;
}
#pragma mark - Cleanup
-(void)dealloc
{
    [_myArray release];
    [super dealloc];
}
#pragma mark - Instance Methods
-(void)doSomething
{
    NSLog(@"myArray: %@", self.myArray);
}

#pragma mark - Private Methods
-(NSArray *)fetchArrayData
{
    NSArray *arrayData = [NSArray arrayWithObjects:@"Apples", @"Oranges", nil];
    return arrayData;
}
@end

答案 2 :(得分:0)

如果以编程方式创建控制器,则可以在initWithStyle:初始化实例变量;如果是从nib / storyboard加载,则可以在initWithCoder: / awakeFromNib中初始化实例变量。