Pergunta

No AppDelegate, estou alloc'ing uma instância definida em uma biblioteca estática. Esta instância tem uma propriedade NSString definir uma "cópia". Quando eu acessar a propriedade seqüência nesta instância, o aplicativo trava com 'Expulso selector não reconhecido a instância'. Xcode fornece uma referência de código para a propriedade, o que significa que é conhecido no aplicativo de chamada. A classe particular é compilado para o alvo biblioteca estática. O que eu estou ausente?

Como adicionar algum código.

//static library 
//ClassA.h
@interface ClassA : NSObject {
...
NSString *downloadUrl;
}
@property(nonatomic, copy) NSString *downloadUrl;

//ClassA.m
@synthesize downloadUrl;

Em appDelegate do aplicativo de chamada.

//app delegate header file
@interface myApp : NSObject <UIApplicationDelegate> {
ClassA *classA;
}
@property (nonatomic, retain) ClassA *classA;

//app delegate .m file
@synthesize classA;

- (void)applicationDidFinishLaunching:(UIApplication *)application {
classA = [[ClassA alloc] init];
//exception occurs here.  downloadUrl is of type NSCFNumber
classA.downloadUrl = @"http://www.abc.com/";
...}

Outras classes no aplicativo irá obter uma referência para o delegado e chamada classA.downloadUrl.

Foi útil?

Solução

1) é a sintetizar dentro do bloco @implementation?

2) Se você se refere a self.classA = [[ClassA alloc] init]; e self.classA.downloadUrl = @"..." vez de classA simples?

3) No seu arquivo myApp.m você precisa ClassA.h importação, quando se está faltando o padrão será um número, ou ponteiro? (Em C variáveis ??padrão para int se não for encontrado pelo compilador):

#import "ClassA.h".

Outras dicas

Set bandeira -ObjC em outra bandeira vinculador na sua configuração Project ... (não no projeto de biblioteca estática, mas o projeto que está usando biblioteca estática ...) E certifique-se de que em projeto de definições de configuração está definido para Toda a configuração

Um monte de pessoas têm dado algumas respostas muito técnicas para esta e outras questões semelhantes, mas eu acho que é mais simples do que isso. Às vezes, se você não está prestando atenção um seletor que você não pretende usar pode ser ligado a alguma coisa na interface. Você pode estar recebendo este erro porque o seletor está lá, mas você não tenha escrito qualquer código para ele.

A maneira mais fácil de verificar novamente que este não é o caso é control-clique no item que você possa ver todos os seletores que lhe estão associados. Se há alguma coisa lá dentro que você não quer ser, se livrar dele! Espero que isso ajude ...

No código que você postou, você está enviando o setter setDownloadURL: para ClassA - isto é, a própria classe . Você deseja definir a propriedade de uma instância.

Como você está se importando ClassA em seu AppDelegate Classe? Você incluiu o arquivo .h no projeto principal? Eu tive esse problema por um tempo porque eu não copiar o arquivo de cabeçalho no projeto principal, bem como o #include normal "ClassA.h."

Copiar, ou criando o .h resolvido para mim.

Para mim, o que causou esse erro foi que eu acidentalmente teve a mesma mensagem a ser enviada duas vezes para o mesmo membro da classe. Quando eu cliquei direito sobre o botão no gui, eu podia ver o nome do método duas vezes, e eu acabei de excluir um. Novato erro no meu caso, com certeza, mas queria tirá-lo lá para outros iniciantes a considerar.

O meu era algo simples / estúpida. Novato erro, para qualquer um que converteu sua NSManagedObject a um NSObject normal.

Eu tive:

@dynamic order_id;

quando eu deveria ter:

@synthesize order_id;

Você deve observar que este não é necessariamente o melhor padrão de design. Desde a aparência dele, que são essencialmente usando seu App Delegado para armazenar o que equivale a uma variável global.

Matt Gallagher cobriu a questão dos globals bem em seu cacau com o artigo Love at http://cocoawithlove.com/2008/11/singletons-appdelegates-and-top-level.html . Em toda a probabilidade, o seu ClassA deve ser um singleton em vez de um mundial na AppDelegate, embora a sua possível que você ClassA intenção de ser objectivo mais geral e não simplesmente um singleton. Nesse caso, você provavelmente estaria melhor fora com qualquer um método de classe para retornar uma instância pré-configurada de Classe A, algo como:

+ (ClassA*) applicationClassA
{
    static ClassA* appClassA = nil;
    if ( !appClassA ) {
        appClassA = [[ClassA alloc] init];
        appClassA.downloadURL = @"http://www.abc.com/";
    }
    return appClassA;
}

Ou, alternativamente, (desde que gostaria de acrescentar material de aplicação específica para o que é, possivelmente, uma classe de uso geral), criar uma nova classe cujo único propósito é conter esse método de classe.

O ponto é que a aplicação globals não precisa ser parte do AppDelegate. Só porque o AppDelegate é um singleton conhecido, não significa que todos os outros aplicativo global deve ser misturado com ele, mesmo que eles não têm nada conceitualmente a ver com lidar com os métodos de delegado NSApplication.

Muito estranho, mas. Você tem que declarar a classe para a instância aplicativo como myApplication: UIApplication vez de myApplication: NSObject. Parece que o protocolo UIApplicationDelegate não implementa a mensagem registerForSystemEvents +. Louco de Apple APIs, novamente.

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