Objective-C'de "unrecognized selector sent to instance" hatası

Bir düğme oluşturdum ve bunun için bir eylem ekledim, ancak düğme çağrılır çağrılmaz bu hatayı aldım:

-[NSCFDictionary numberButtonClick:]: unrecognized selector sent to instance
 0x3d03ac0 2010-03-16 22:23:58.811
 Money[8056:207] *** Terminating app
 due to uncaught exception
 'NSInvalidArgumentException', reason:'*** -[NSCFDictionary numberButtonClick:]:  unrecognized selector sent to instance 0x3d03ac0'

Bu benim kodum:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
        UIButton *numberButton = [UIButton buttonWithType:UIButtonTypeCustom];        
        numberButton.frame = CGRectMake(10, 435, 46, 38);
        [numberButton setImage:[UIImage imageNamed:@"one.png"] forState:UIControlStateNormal];
        [numberButton addTarget:self action:@selector(numberButtonClick:) forControlEvents:UIControlEventTouchUpInside];
        [self.view addSubview: numberButton]; 
    }
return self;
}

-(IBAction)numberButtonClick:(id)sender{
    NSLog(@"---");
}
Çözüm

Görünüşe göre görünüm denetleyicisinin belleğini düzgün bir şekilde yönetmiyorsunuz ve bir noktada bellekten ayrılıyor - bu da numberButtonClicked: yönteminin, görünüm denetleyicisinin daha önce kullandığı belleği işgal eden başka bir nesneye gönderilmesine neden oluyor...

Görünüm denetleyicinizi düzgün bir şekilde tuttuğunuzdan/serbest bıraktığınızdan emin olun.

Yorumlar (10)

Buraya benim gibi Google üzerinden ulaşanlar için, muhtemelen ARC ile daha çok Xcode 4.2+/iOS 5+ ile ilgilidir. Aynı hatayı aldım "örneğe gönderilen tanınmayan seçici". Benim durumumda, bir UIButton'un hedef eylemi kendisini gönderen parametresi olarak geçirecek şekilde ayarlanmıştı, ancak daha sonra buna ihtiyacım olmadığını fark ettim ve kodda bunu kaldırdım. Yani, şöyle bir şey:

- (IBAction)buttonPressed:(UIButton *)sender {

olarak değiştirildi:

- (IBAction)buttonPressed {

Söz konusu UIButton'a sağ tıklandığında, Touch Up Inside olayının görünüm denetleyicilerinin buttonPressed: yöntemiyle ilişkili olduğu görüldü. Bunu kaldırmak ve değiştirilen yönteme yeniden atamak işe yaradı.

Yorumlar (13)

Bu sorun için Google'da en çok aranan yanıt buydu, ancak benim farklı bir nedenim/sonucum vardı - başkalarının da bu sorunla karşılaşması ihtimaline karşı kendi fikrimi ekleyeyim dedim.

Daha bu sabah benzer bir sorun yaşadım. Sorunu veren kullanıcı arayüzü öğesine sağ tıklarsanız, hangi bağlantıların oluşturulduğunu görebileceğinizi keşfettim. Benim durumumda iki eyleme bağlı bir düğmem vardı. Eylemleri sağ tıklama menüsünden sildim ve yeniden bağladım ve sorunum çözüldü.

Bu yüzden eylemlerinizin doğru şekilde yapıldığından emin olun.

Yorumlar (2)