2009-09-03 16 views
5

El UITabBarController no permite la orientación horizontal. Así que utilicé una subclase de UITabBarContoller (llamada RotatingTabBarController). Su único propósito es permitir la rotación devolviendo SÍ a la llamada a ShouldAutorotateToInterfaceOrientation.Orientación horizontal para UITabBarController?

El problema es que cuando gira el iPhone en el simulador da el siguiente error malloc.

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

Estoy usando 3.0 SDK con Xcode 3.2 en Snow Leopard. Establecí un punto de interrupción en malloc_error_break pero no puedo rastrearlo hasta mi código. ¿Hay algo que pueda hacer para que este error desaparezca?

Aquí es la clase RotatingTabBarController:

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

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

Actualización:

he intentado lo mismo con una categoría. Pero da el mismo error malloc.

// 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) 
+1

Logramos que rotar utilizando una categoría en UITabBarController en lugar de una subclase, y eso nos funciona. No estoy seguro de qué hacer con su error, me temo que no me he encontrado en esta circunstancia :( – Kevlar

+0

¿Puede explicar cómo hacer la implementación de la categoría? – Vic

+0

Probé el enfoque de Kevlar así, pero todavía estoy conseguir el mismo error liberado puntero malloc :( // UITabBarController + Rotation.h @interface UITabBarController (rotación) - (BOOL) shouldAutorotateToInterfaceOrientation:. (UIInterfaceOrientation) interfaceOrientation; @end // UITabBarController + Rotation.m #import "UITabBarController + Rotation.h" @implementation UITabBarController (rotación) - (BOOL) shouldAutorotateToInterf aceOrientation: (UIInterfaceOrientation) interfaceOrientation { return YES; } @end – Vic

Respuesta

8

Esto es un error en el iPhone SDK 3.0. Se soluciona en iPhone SDK 3.1

0

Ese error se ve como algo es o bien de ser liberado sin un alloc/init, o que está siendo doble en libertad, no se ve como un error en su sub-classing o código

Me gusta el enfoque de categoría de Kevlar para resolver su problema, es creativo, simple y debería funcionar para usted.

+0

Le pedí a Kevlar que me explique cómo hacer la implementación de la categoría. – Vic

+0

si probaste el enfoque por categoría y no funciona, eso es solo una prueba más de que el problema no es tu clase infantil, sino que está en otra parte. Verifique sus ciclos de alloc/init/release y asegúrese de que no está liberando dos veces – slf

+0

Este es un proyecto básico. En Xcode, creé un nuevo proyecto de prueba como "aplicación de barra de pestañas". Se agregaron los dos archivos UIBarabbbarController + Rotation.h & .m al proyecto y se agregó la línea #import "UITabBarController + Rotation.h" a TestAppDelegate.h. Eso es todo, no hay otro código en el proyecto pero aún da el error. – Vic

8

Subclases UITabBarController no es una forma recomendada de obtener la rotación de la interfaz. De hecho, la documentación de Apple dice estrictamente que no se subclasifique ni UITabBarController ni UINavigationController. También dice que para que UITabBarController sea compatible con autorrotación, todos los controladores 'gestionados' por él deben soportar esta orientación (es decir, paisaje en este caso).

+1

Gracias por la respuesta. Estaba corriendo en círculos hasta que lo leí. Uno de mis puntos de vista no estaba completo aún y, por supuesto, no respondió "SÍ". – R4cOON

+0

relacionado: la rotación funcionaba para mí (utilizando el método aprobado por Apple para que todos los controladores "administrados" devolvieran SÍ), pero mis vistas no se redimensionaron automáticamente al rotar, a pesar de tener todas las propiedades de ajuste de tamaño establecidas correctamente en el constructor de interfaces. Esta pepita me ayudó: http://www.codebunnygames.com/?p=18 – mattorb

Cuestiones relacionadas