【问题标题】:If I have a UITableViewController class, where do I initialize its instance variables?如果我有一个 UITableViewController 类,我在哪里初始化它的实例变量?
【发布时间】:2013-03-19 18:19:21
【问题描述】:

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

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

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

在这个例子中,我说的是为这个类创建 NSMutableArray(分配并初始化它)。

【问题讨论】:

  • 你是如何创建这个类的实例的?您是在情节提要/笔尖中执行此操作还是从代码中执行此操作?
  • 什么实例变量?如果您需要任何有用的帮助,您需要提供一些有用的信息。
  • 对不起,我会在问题中澄清。假设我有一个 NSMutableArray 我需要分配 init,我在哪里做呢?而这个类是初始视图控制器,所以它是自动创建的。
  • 考虑在 getter 中使用惰性初始化,这将是一个独立于初始化的通用解决方案。

标签: ios objective-c xcode ios5 ios6


【解决方案1】:

您可以使用 A-Live 在 cmets 中建议的延迟加载技术,以便在您实际需要时初始化您的数组。这个想法是,在属性 getter 中,您首先检查您的数组是否已初始化。如果没有,初始化然后返回。

示例

注意:这是一个粗略且未经测试的示例,您可能需要制作 必要的更改取决于您是否使用 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】:

    你有 4 种初始化方法:

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

    这完全取决于您如何实例化该类。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-26
        • 2023-01-20
        • 2021-05-11
        • 1970-01-01
        • 2011-06-21
        • 1970-01-01
        相关资源
        最近更新 更多