views:

2009

answers:

3

The UITabBarController does not allow landscape orientation. So I used a subclass of UITabBarContoller (called RotatingTabBarController). Its sole purpose it to allow rotation by returning YES to shouldAutorotateToInterfaceOrientation call.

The problem is that when you rotate the iPhone in simulator it gives the following malloc error.

malloc: *** error for object 0x3888000: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug

I am using 3.0 SDK with Xcode 3.2 on Snow Leopard. I set a breakpoint in malloc_error_break but I can not trace it back to my code. Is there something I can do to make this error go away?

Here is the RotatingTabBarController class:

#import <UIKit/UIKit.h>
@interface RotatingTabBarController : UITabBarController {
}
@end 

@implementation RotatingTabBarController
-(BOOL)shouldAutorotateToInterfaceOrientation:UIInterfaceOrientation)interfaceOrientation {
    return YES;
}
@end

Update:

I tried the same with a category. But it gives the same malloc error.

// UITabBarController+Rotation.h
@interface UITabBarController (rotation)
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation;
@end

// UITabBarController+Rotation.m
#import "UITabBarController+Rotation.h"

@implementation UITabBarController (rotation)
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
   return YES;
}
@end

Backtrace

[Session started at 2009-09-05 12:13:19 -0400.]
Untitled(992,0xa06d9500) malloc: *** error for object 0x2024000: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
Untitled(992,0xa06d9500) malloc: *** error for object 0x2014000: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug

[Session started at 2009-09-05 12:13:27 -0400.]
GNU gdb 6.3.50-20050815 (Apple version gdb-1344) (Fri Jul  3 01:19:56 UTC 2009)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "x86_64-apple-darwin".Attaching to process 992.
sharedlibrary apply-load-rules all
(gdb) bt
#0  0x951908fa in mach_msg_trap ()
#1  0x95191067 in mach_msg ()
#2  0x30244d62 in CFRunLoopRunSpecific ()
#3  0x30244628 in CFRunLoopRunInMode ()
#4  0x32044c31 in GSEventRunModal ()
#5  0x32044cf6 in GSEventRun ()
#6  0x309021ee in UIApplicationMain ()
#7  0x00002608 in main (argc=1, argv=0xbfffef94) at /Users/vishwas/Desktop/Untitled/main.m:13
(gdb)
A: 

That error looks like something is either being released without an alloc/init, or it's being double released, doesn't look like an error in your sub-classing or code.

I like Kevlar's category approach to solve your problem, it's creative, simple, and should work for you.

slf
I have asked Kevlar to explain how to do the category implementation.
if you tried the category approach and it's not working, that's just more proof that the problem is not your child class, it's somewhere else. Check your alloc/init/release cycles and make sure you are not double releasing
slf
when you receive the error, drop to the GDB console and type backtrace to get a stack dump
slf
+7  A: 

This is a bug in iPhone SDK 3.0. It is fixed in iPhone SDK 3.1

+2  A: 

Subclassing UITabBarController is not a recommended way to get interface rotation. In fact Apple's documentation strictly says not to subclass either UITabBarController or UINavigationController. It also says that in order for UITabBarController to support autorotation, all controllers 'managed' by it must support this orientation (i.e landscape in this case).

maciejs
Thanks for the answer. I was running in circles until I read it. One of my views wasn't complete yet and of course didn't return "YES".
R4cOON