2010-11-10 40 views
2

有些人可以解释如何适当地继承UIViewController,然后将其加载到窗口中而不使用一个笔尖。有人可以解释正确的方法来分类一个UIViewController

我是否需要设置视图以及何时执行该操作?的loadView?

当我使用我的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]; 

} 
+0

它抱怨“访问不良”,因为你搞砸了你的内存管理的地方。看看GDB的回溯,看看崩溃发生的位置。这会给你一个强大的线索,你什么对象,你忘了保留/过度发布。 – 2010-11-10 05:37:02

+0

太细节。如果你可以看到视图和按钮,那么你可能在正确的地方创建了一些东西(loadView),但是在一个对象上的保留计数很差。发布您的loadView代码。 – 2010-11-10 05:39:56

+0

更新了帖子。如果我注释掉我抓住UINavigationController的行,那么一切正常 – Arcadian 2010-11-10 05:54:28

回答

2

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

使用pushNavigationController在调用堆栈上发生崩溃还是会在稍后发生崩溃?

您也不需要释放split,vcArray或detailViewController。 [detailViewController版本]肯定会导致崩溃。其他人稍后会导致崩溃。

当函数返回的对象,除非你正在呼吁留住它,或返回对象的功能被命名为分配/复制/创建,该对象将被自动释放,所以你不需要将其释放。

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 

您将调用在上面的第二个例子中保留的原因是,如果你想使用的对象此功能之外。如果你需要保留它,否则它会在稍后自动发布。

更新:您有添加按钮的类似问题。

+0

好吧我更新了帖子以反映我的代码,我仍然有问题(相同) – Arcadian 2010-11-10 06:04:17

+0

你在我的GettingStart viewDidLoad中看到什么奇怪的东西?它是UIViewController的子类 – Arcadian 2010-11-10 06:07:38

+0

是的 - 阅读我上面写的关于何时发布的内容,并将其与您如何构建按钮进行比较 – 2010-11-10 06:09:09

1

摆脱这行代码

[btnAddUser release]; 

此对象btnAddUser'的是自动释放池的一部分,你必须不叫释放。你只需要release/autorelease对象创建或分配使用

alloc, copy, or retain 
相关问题