Wesley
Wesley

Reputation: 2200

Bad Access - iPhone Xcode 4

I'm a beginner with Xcode and Objective-C, i want to make a view controller in code without a nib file and shape it how i want. Currently with this very simple code I can't seem to even change the background color because of EXC_BAD_ACCESS.

I read on internet it is something with memory management but I can't seem to find the fix for this. Pieces of my code:

AppDelegate.h

#import <UIKit/UIKit.h>
#import "DefaultViewController.h"

@class DefaultViewController;

@interface AppDelegate : NSObject <UIApplicationDelegate> {
    UIWindow *window;
    UIViewController *rootViewController;
}

@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet UIViewController *rootViewController;

@end

AppDelegate.m

@synthesize window = _window;
@synthesize rootViewController = _rootViewController;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    UIViewController *rvc = [[DefaultViewController alloc] init];
    self.rootViewController = rvc;
    [rvc release];

    [self.window addSubview:self.rootViewController.view];

    // Override point for customization after application launch.
    [self.window makeKeyAndVisible];
    return YES;
}

- (void)dealloc
{
    [_window release];
    [_rootViewController release];
    [super dealloc];
}

The view controller I made via, right click -> new file and UIViewController subclass without xib! In the loadView I only try this:

self.view.backgroundColor = [UIColor redColor];

Upvotes: 0

Views: 1237

Answers (5)

Murali Raghuram
Murali Raghuram

Reputation: 265

There are a few issues with your code. But first the key problem you are getting EXC_BAD_ACCESS is because you are calling self.view.backgroundColor inside the loadView. If you override loadView, you must construct your view hierarchy inside the method. By not creating a view hierarchy in that method you are calling backgroundColor on a view that does not exist. Instead completely remove the loadView method or comment it out and move self.view.backgroundColor into the viewDidLoad method. (Remember even an empty loadView method will be a problem, you need to remove it or comment it out)

Second.. change your code to

self.rootViewController = rvc; to self.window.rootViewController = rvc;

BTW, once you add a view controller you don't need to add the view of the rootViewController as a subview to the window again. Assigning a view controller to the rootViewController property installs the view controller's view as the content view of the window.

Third. When you are initializing DefaultViewController you do

UIViewController *rvc = [[DefaultViewController alloc] init];

dont do that, instead do

DefaultViewController *rvc = [[DefaultViewController alloc] init];

Upvotes: 1

XMLSDK
XMLSDK

Reputation: 259

You should call: UIViewController *rvc = [[DefaultViewController alloc] initWithNibName:@"yournib" bundle:nil]; to load the NIB view. Otherwise, your rvc.view will be nil.

Sorry, I overlooked.

The answer is: you should not call self.view.backgroundColor = [UIColor redColor]; within - (void)loadView since self.view is nil firstly at this stage. He has to show that he has correctly created at least self.view = [[UIView alloc] init] in loadView.

Upvotes: -1

rjgonzo
rjgonzo

Reputation: 1761

What's inside your DefaultViewController? If you are not using a nib file, did you implement -(void)loadView ?

Upvotes: 0

Adrian Rodriguez
Adrian Rodriguez

Reputation: 3242

Change the code so it's

self.window.rootViewController = rvc;
[self.window makeKeyAndVisible];
return YES;

Upvotes: 0

Rudy Velthuis
Rudy Velthuis

Reputation: 28806

The problem could be that the rootViewController doesn't have an initialized view. Hard to tell, since you don't show the code of the DefaultViewController. It could also be another error in DefaultViewController.


FWIW, you have two obsolete ivars:

@interface AppDelegate : NSObject <UIApplicationDelegate> {
    UIWindow *window;
    UIViewController *rootViewController;
}

You can delete these, since you synthesize _window and _rootViewController and never use the above.

Upvotes: 1

Related Questions