【问题标题】:Can someone explain the proper way to sub class a UIViewController有人可以解释对 UIViewController 进行子类化的正确方法吗
【发布时间】:2010-11-10 05:34:25
【问题描述】:

能否解释一下如何正确子类化 UIViewController,然后在不使用 nib 的情况下将其加载到窗口中。

我是否需要设置视图以及何时设置?加载视图?

当我使用我的 customUIViewController 子类时,我的应用程序崩溃了。一切都加载找到,直到我点击一个按钮,它与“错误访问”有关

GettingStarted *vc = [[GettingStarted alloc] init];


UISplitViewController *split = self.splitViewController;
NSArray *vcArray = split.viewControllers;

NSLog(@"viewcontroll cout:%d", vcArray.count);

    // this line of code crashes my app. I fi comment it out everything works fine
UINavigationController *detailViewController = (UINavigationController*)[vcArray objectAtIndex:1];
//


detailViewController  pushViewController:vc animated:YES];


[vc release];

GettingStarted.m

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
    [super viewDidLoad];

[self.navigationItem setHidesBackButton:YES animated:YES];

//UIView *baseView = [[UIView alloc] init];

[[self navigationItem] setTitle:@"Getting Started"];

UIImageView *noUsersIV = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"no_users.png"]];

[noUsersIV setFrame:CGRectMake(0.0f, 0.0f, 466, 961.0f)];
[noUsersIV setHidden:NO];
[noUsersIV setTag:1006];
[[self view] addSubview:noUsersIV];
[noUsersIV release];


UIButton *btnAddUser = [UIButton buttonWithType:UIButtonTypeCustom];
[btnAddUser setImage:[UIImage imageNamed:@"no_users_button_standard.png"] forState:UIControlStateNormal];
[btnAddUser setImage:[UIImage imageNamed:@"no_users_button_activated.png"] forState:UIControlStateSelected];
[btnAddUser addTarget:self action:@selector(addUser:) forControlEvents:UIControlEventTouchUpInside];
[btnAddUser setFrame:CGRectMake(0, 428,466, 124)];


[[self view] addSubview:btnAddUser];

[btnAddUser release];


//self.view = baseView;

//[baseView release];

}

【问题讨论】:

  • 它抱怨“访问不正确”,因为您在某处搞砸了内存管理。查看 GDB 中的回溯以了解崩溃发生的位置。这将为您提供有关您忘记保留/过度释放的对象的有力线索。
  • 细节太少了。如果您可以看到视图和按钮,那么您可能正在正确的位置(loadView)创建东西,但是对象的保留计数很差。发布您的 loadView 代码。
  • 更新了帖子。如果我注释掉我抓取 UINavigationController 的那一行,那么一切正常

标签: objective-c ios4


【解决方案1】:

您的日志消息的结果是什么?您确定该数组中有 >=2 个对象吗?

是调用堆栈上的 pushNavigationController 发生崩溃,还是稍后发生崩溃?

您也不需要释放 split、vcArray 或 detailViewController。 [detailViewController release] 肯定会导致崩溃。其他的会在以后导致崩溃。

当函数返回对象时,除非你在其上调用retain,或者返回对象的函数被命名为alloc/copy/create,对象将被自动释放,所以你不需要释放它。

someArray = [NSArray arrayWithObjects:...]; // no need to release
someArray = someClass.array; // no need to release

someArray = [[NSArray alloc] init]; // alloc, need to release
someArray = [[NSArray arrayWithObjects:...] retain]; // retained, need to release

在上面的第二个示例中调用retain 的原因是如果您希望在此函数之外使用该对象。如果你需要保留它,否则它会在以后自动发布。

更新:您在添加按钮时遇到了类似的问题。

【讨论】:

  • 好的,我更新了帖子以反映我的代码,但我仍然遇到问题(相同)
  • 您在我的 GettingStart viewDidLoad 中看到了什么奇怪的东西?它是 UIViewController 的子类
  • 是的 - 阅读我上面写的关于何时发布的内容,并将其与您构建按钮的方式进行比较
  • 我不明白你在说什么。我不应该释放它们吗?
  • 我已将相关段落加粗。注意你在 loadView 底部的 UIButton 做什么。我并不是要含糊其辞,但是了解这里的问题是 Objective-C 的基础,所以如果你需要一天的时间来弄清楚,那将是值得度过的一天。
【解决方案2】:

去掉这行代码

[btnAddUser release];

这个对象'btnAddUser'是自动释放池的一部分,你不能调用释放。您只需 release/autorelease 使用

创建或分配的对象
alloc, copy, or retain

【讨论】:

    猜你喜欢
    • 2012-07-09
    • 2011-01-16
    • 2019-06-05
    • 1970-01-01
    • 2022-09-27
    • 1970-01-01
    • 2020-11-12
    • 1970-01-01
    • 2021-04-01
    相关资源
    最近更新 更多