Pregunta

he encontrado un fallo en una aplicación iPhone con iOS 4 objetivo que cambia en función del tipo de construcción.

El depurador está dando nada me sirve mucho para seguir adelante, se detiene en

 UIViewController *result = [self factory](self);

con EXC_BAD_ACCESS. self es una clase que hereda de NSObject (muestra a continuación como NSObjectInheritor). Los zombis están habilitadas. He intentado cambiar el método factory tres maneras con los siguientes resultados.

Esto se estrella tanto en depuración y ad hoc construye ...

- (FactoryMethod) factory;
{
    return [^ UIViewController * (NSObjectInheritor *newThing)
    {
      return [[ViewControllerClass alloc] initWithStuff:(boolValue ? foo : bar)];
    } autorelease];
}

Esto funciona de versiones de depuración, pero se estrella en especial ...

- (FactoryMethod) factory;
{
  return [^ UIViewController * (NSObjectInheritor *newThing)
  {
    if(boolValue)
    {
      return [[ViewControllerClass alloc] initWithStuff:foo];
    }
    else
    {
      return [[ViewControllerClass alloc] initWithStuff:bar];
    }
  } autorelease];
}

Esto funciona tanto de depuración y ad hoc, pero es muy feo y redundante:

- (FactoryMethod) factory;
{
  if(boolValue)
  {
    return [^ UIViewController * (NSObjectInheritor *newThing)
    {
      return [[ViewControllerClass alloc] initWithStuff:foo];
    } autorelease];
  }
  else
  {
    return [^ UIViewController * (NSObjectInheritor *newThing)
    {
      return [[[ViewControllerClass alloc] initWithStuff:bar];
    } autorelease];
  }
}

Mi teoría es que boolValue se vuelve inaccesible a la vez que se ejecuta el bloque devuelto. Es

@interface SubclassOfNSObjectInheritor : NSObjectInheritor
{
  BOOL boolValue;
}

@property (readonly) BOOL boolValue;

(YES o NO asignado en init del curso del SubclassOfNSObjectInheritor) y

@synthesize boolValue;

en la implementación del SubclassOfNSObjectInheritor.

Las preguntas finales son - es mi teoría acerca de lo que está mal correcta? Es la tercera forma de hacerlo - observó como trabajar en ad hoc y versiones de depuración - seguro? ¿Cuál es la mejor manera de hacer esto?

¿Fue útil?

Solución

Su problema es doble, primero se overreleasing su bloque y en segundo lugar, se van creando bloques en la pila, que se iba, se los devuelve el método (que está básicamente devolviendo un puntero en el marco de la pila previamente destruido).

En su lugar, copie el bloque y concesionarios liberación antes de regresar. Puede hacer esto de la manera Objective-C con un mensaje copy, tu puedes llamar a la función Block_copy().

Su estrellarse en varias configuraciones es pura casualidad. Por lo tanto, para fijar uno de sus implementaciones:

- (FactoryMethod) factory;
{
  return [[^(NSObjectInheritor *newThing)
  {
    if(boolValue)
    {
      return [[ViewControllerClass alloc] initWithStuff:foo];
    }
    else
    {
      return [[ViewControllerClass alloc] initWithStuff:bar];
    }
  } copy] autorelease];
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top