Pergunta

Estou enfrentando um problema com uma string que contém caracteres codificados. Especificamente, se a string codificou caracteres, ela acaba se tornando inválida enquanto uma string "normal" não o fará.

No arquivo .h:

@interface DirViewController : TTThumbsViewController 
<UIActionSheetDelegate,UINavigationControllerDelegate,UIImagePickerControllerDelegate>
{
    NSString *sourceFolder;
    NSString *encodedSourceFolder;
}

@property (nonatomic, retain) NSString *sourceFolder;
@property (nonatomic, retain) NSString *encodedSourceFolder;

No arquivo .m:

- (id)initWithFolder:(NSString*)folder query:(NSDictionary*)query {

    if (self = [super init]) {

        sourceFolder = folder;

    }

  return self;
}

Até agora, tudo parece correr como esperado. Em ViewDidload, tenho o seguinte:

sourceFolderCopy = [self urlEncodeValue:(sourceFolder)];

//I also have this button, which I'll refer to later:
UIBarButtonItem *importButton = [[UIBarButtonItem alloc] initWithTitle:@"Import/Export" style:UIBarButtonItemStyleBordered 
                                                                target:self
                                                                action:@selector(importFiles:)];
self.navigationItem.rightBarButtonItem = importButton;

Que usa o seguinte método para codificar a string (se tiver caracteres que eu quiser codificado):

- (NSString *)urlEncodeValue:(NSString *)str { 

    NSString *result = (NSString *) CFURLCreateStringByAddingPercentEscapes (kCFAllocatorDefault, (CFStringRef)str, NULL, CFSTR(":/?#[]@!$&’()*+,;="), kCFStringEncodingUTF8); 

    return [result autorelease]; 

}

Se o resultado do NSLog, recebo os valores esperados. Se a string tiver caracteres como um espaço em branco, eu recebo uma corda com codificação. Se a string não tiver caracteres que precisem ser codificados, ela apenas me dará a string original.

Eu tenho um botão na barra de navegação que inicia um processo de importação de imagem abrindo uma folha de ação. Quando o método para a folha de ação é iniciado, minha string será inválida - mas apenas se contiver caracteres codificados. Se for apenas uma corda "normal", está tudo bem e age como esperado. Estou fora da minha codificação? No começo, pensei que poderia ser um problema de memória, mas não consigo descobrir por que isso afetaria apenas seqüências codificadas.

Aqui é onde a folha de ação é definida (e o primeiro lugar que posso ver a string codificada se tornando inválida), as declarações NSLog são onde trava:

- (IBAction)importFiles:(id)sender {

NSLog(@"logging encodedSF from import files:");
NSLog(@"%@",encodedSourceFolder);//crashes right here
NSLog(@"%@",sourceFolder);

if (shouldNavigate == NO)
{
    NSString *msg = nil;
    msg = @"It is not possible to import or export images while in image selection mode.";

    UIAlertView *alert = [[UIAlertView alloc] 
                          initWithTitle:@"Unable to Import/Export" 
                          message:msg 
                          delegate:self 
                          cancelButtonTitle:@"OK" 
                          otherButtonTitles:nil];
    [alert show];
    [alert release];
    [msg release];
}   

else{
    UIActionSheet *actionSheet = [[UIActionSheet alloc] 
                                  initWithTitle:@"What would you like to do?" 
                                  delegate:self 
                                  cancelButtonTitle:@"Cancel"
                                  destructiveButtonTitle:nil 

                                  otherButtonTitles:@"Import Photos (Picker)", @"Export Photos", nil, nil];

    [actionSheet showInView:self.view];
    [actionSheet release];
  }
}

Não recebo erros de colisão indo para o console. Ao usar pontos de interrupção, pude ver que o codedSourceFolder é inválido no método da folha de ação.

Nenhuma solução correta

Outras dicas

Você deve copiar sua sequência de pastas passada na pasta no seu initwithfolder: consulta: método como este ou criar uma nova string com:

- (id)initWithFolder:(NSString*)folder query:(NSDictionary*)query {

    if (self = [super init]) {

        sourceFolder = [folder copy];

    }

    return self;
}

Caso contrário, sua string fica autorizada em outros lugares.

Fazer não usar retain por NSString propriedades. Usar copy:

@property (nonatomic, copy) NSString *sourceFolder;

Existem várias perguntas/respostas aqui que explicam isso ainda mais, como a resposta de Chris Hanson em:

Propriedade NSString: copie ou retenha?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top