Pregunta

Estoy tratando de entender la forma en que funciona el arco, y por lo que sé, debería estar haciendo algo mal aquí.Este es el código que estoy usando:

interfaz:

@interface ViewController : UIViewController{

}

@property (strong, nonatomic) NSString * myString ; 
@property (weak, nonatomic) NSString * myPointer ;

Implementación:

 - (void)viewDidLoad{

     [super viewDidLoad];
     self.myString = @"Hello world!" ; // myString is strong
     self.myPointer = self.myString ; // myPointer var is weak

     [self performSelector:@selector(makeNilMyValue) withObject:nil afterDelay:1];    
     [self performSelector:@selector(printValues) withObject:nil afterDelay:2];    
}

 - (void) makeNilMyValue{
     self.myString = nil ; 
}

 - (void) printValues{
     NSLog(@"myString: %@", self.myString) ;
     NSLog(@"myPointer: %@", self.myPointer) ; 
 }

Después de ejecutar esto, recibo:

2012-02-26 11:40:41.652 test1[933:207] myString: (null)

2012-02-26 11:40:41.653 test1[933:207] myPointer: Hello world!

Si no me equivoco, debido a que MyPointer es débil, no debe conservar el contenido del objeto.Entonces, debería mostrar nil en lugar de "Hello World!".

¿Qué estoy haciendo mal?

Siguiendo la respuesta de Caleb, he creado otro puntero débil, vea el código a continuación:

- (void)viewDidLoad{
    [super viewDidLoad];
    self.myString = @"Hello world!" ; // myString is strong
    self.myPointer = self.myString ; // myPointer var is weak
    self.myPointer2 = self.myString ; // myPointer2 var is weak

    [self performSelector:@selector(makeNilMyValue) withObject:nil afterDelay:1];    
    [self performSelector:@selector(printValues) withObject:nil afterDelay:2];    
}

- (void) makeNilMyValue{
    self.myPointer2 = @"value changed!" ;
    self.myString = nil ;

}

- (void) printValues{
    NSLog(@"myString: %@", self.myString) ;
    NSLog(@"myPointer: %@", self.myPointer) ;
}

El punto es que todavía tengo la misma respuesta que solía tener:

2012-02-26 12:08:13.426 test1[1333:207] myString: (null)
2012-02-26 12:08:13.427 test1[1333:207] myPointer: Hello world!

¿Fue útil?

Solución

Como señaló Caleb, usando una constante NSString para este ejemplo no es una buena idea.

La forma más sencilla de crear un objeto de cadena en el código fuente es usar el Objetivo-C @ "..." Construction:

nstring * temp= @ "/ tmp / scratch"; Tenga en cuenta que, al crear una cadena constante de esta manera, debe evitar usar cualquier cosa menos de 7 bits Caracteres ASCII. Tal objeto se crea en el tiempo de compilación y existe. A lo largo de la ejecución de su programa. El compilador hace tal objeto. constantes únicos en una base por módulo, y nunca se desalientan, Aunque puede conservarlos y liberarlos mientras hace algún otro objeto. Tú También puede enviar mensajes directamente a una constante de cadena como usted hace cualquier Otra cadena:

bool mismo= [@ "comparación" isequaltostring: mystring];

The Documentación explica que las cadenas constantes nunca desaparecer.

Intenta usar algo más para su experimento. Probé NsObject y producí resultados esperados.

Interfaz:

@interface ViewController : UIViewController

@property (strong, nonatomic) NSObject * myString; 
@property (weak, nonatomic) NSObject * myPointer;

@end

Implementación:

@implementation ViewController

@synthesize myString = _myString;
@synthesize myPointer = _myPointer;

- (void)viewDidLoad{

    [super viewDidLoad];

    self.myString = [[NSObject alloc] init];
    self.myPointer = self.myString;
    self.myString = nil; 
    NSLog(@"myString: %@", self.myString);
    NSLog(@"myPointer: %@", self.myPointer);
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

@end

Los punteros débiles se establecen en NIL cuando no hay punteros fuertes a la memoria como se explica en la documentación: Apple Developer o llvm .

__ Débil Especifica una referencia que no mantiene vivo el objeto referenciado. Una referencia débil se establece en NIL cuando no hay fuertes Referencias al objeto.

Otros consejos

Entonces, debería mostrar nil en lugar de "Hello World!".

Las cadenas constantes nunca se desalientan, por lo que su "@" Hola mundo! "Nunca desaparezca.Esta es la razón por la que su referencia débil nunca se establece en NIL.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top