jenis penerima *** misalnya pesan adalah deklarasi maju


199

Di aplikasi iOS5 saya, saya memiliki NSObject Stateskelas, dan mencoba memasukkannya:

states = [states init];

di sini adalah initmetode di States:

- (id) init
{
    if ((self = [super init]))
    {
        pickedGlasses = 0;
    }

    return self;
}

Tapi ada kesalahan di telepon states = [states init];

jenis penerima "Serikat" misalnya pesan adalah deklarasi maju

Apa artinya? Apa yang saya lakukan salah?


Saya mencoba memunculkan pertanyaan yang sama, tetapi ada solusi yang berbeda di masing-masing tham. Saya sedikit bingung
SentineL

3
Jawaban yang sangat singkat adalah Anda kehilangan #import (mungkin dalam file Prefiks Anda) atau Anda kehilangan "@class Abc;" line (yaitu dalam file .h tepat di atas baris @interface)
Fattie

Jawaban:


440

Itu pada dasarnya berarti bahwa Anda perlu mengimpor file .h yang berisi deklarasi Negara.

Namun, ada banyak hal lain yang salah dengan kode Anda.

  • Anda sedang mencari objek tanpa +alloc membuatnya. Itu tidak akan berhasil
  • Anda mendeklarasikan objek sebagai tipe non-pointer, itu juga tidak akan berfungsi
  • Anda tidak menelepon [super init]di-init .
  • Anda telah mendeklarasikan kelas menggunakan @classdi header, tetapi tidak pernah mengimpor kelas.

Ini agak aneh meskipun karena dalam kasus saya saya baru saja menghapus .hfile karena masalah referensi melingkar.
Alper

Kata-kata yang benar-benar menggelikan. Tapi, ya, itu memperbaikinya.
TimJowers2

Jika Anda mencoba menggunakan objek Swift di Objective-C, jangan lupa mereka harus mewarisi darinya NSObject.
Michal Šrůtek

27

FWIW, saya mendapatkan kesalahan ini ketika saya mengimplementasikan data inti ke proyek yang ada. Ternyata saya lupa menautkan CoreData.h ke proyek saya. Saya telah menambahkan kerangka kerja CoreData ke proyek saya tetapi menyelesaikan masalah dengan menautkan ke kerangka kerja di header pra-kompilasi saya seperti yang dilakukan templat Apple:

#import <Availability.h>

#ifndef __IPHONE_5_0
#warning "This project uses features only available in iOS SDK 5.0 and later."
#endif

#ifdef __OBJC__
    #import <UIKit/UIKit.h>
    #import <Foundation/Foundation.h>
    #import <CoreData/CoreData.h>
#endif

2
Sungguh memalukan bahwa hampir semua tutorial CoreData dimulai dengan menggunakan templat tetapi tidak dengan proyek yang sudah ada. Sangat mudah untuk membuat kesalahan di sini.
Yeung

24

Saya mendapat pesan semacam ini ketika saya memiliki dua file yang saling bergantung. Yang rumit di sini adalah Anda akan mendapatkan referensi melingkar jika Anda hanya mencoba untuk saling mengimpor (kelas A impor kelas B, kelas B mengimpor kelas A) dari file header mereka. Jadi yang akan Anda lakukan adalah meletakkan @class Adeklarasi forward ( ) di salah satu file header kelas (kelas B). Namun, ketika mencoba menggunakan ivar kelas A dalam implementasi kelas B, kesalahan ini muncul, hanya menambahkan #import "A.h"file .m dari kelas B yang memperbaiki masalah bagi saya.


16

Saya sedang mencoba untuk menggunakan @class "Myclass.h" .

Ketika saya mengubahnya #import "Myclass.h", itu bekerja dengan baik.


Hanya catatan di sini: @class "Myclass.h"benar-benar salah. @class Myclassharus digunakan dalam file header di mana kelas tidak dapat diimpor (karena referensi melingkar, seperti yang akan terjadi dengan kelas Swift-didefinisikan dalam Objective-C) tetapi #import "Myclass.h"harus digunakan jika dapat diimpor.
Pengguna yang bukan pengguna

6

Anda menggunakan

States states;

di mana Anda harus menggunakannya

States *states;

Metode init Anda seharusnya seperti ini

-(id)init {
  if( (self = [super init]) ) {
      pickedGlasses = 0;
  }
  return self;
}

Sekarang akhirnya ketika Anda akan membuat objek untuk kelas States Anda harus melakukannya seperti ini.

State *states = [[States alloc] init];

Saya tidak mengatakan ini adalah cara terbaik untuk melakukan ini. Tetapi mungkin membantu Anda memahami penggunaan dasar dari menginisialisasi objek.


5

Jika Anda mendapatkan kesalahan ini saat mencoba menggunakan kelas Swift atau metode di Objective C : Anda lupa salah satu dari 2 langkah yang didefinisikan Apple pada diagram ini:

masukkan deskripsi gambar di sini

Contoh:

Kesalahan muncul di Test.mfile Anda :

Penerima 'MyClass' untuk pesan kelas adalah deklarasi maju

Langkah 1: cek yang Test.hmemiliki

@class MyClass;

Langkah 2: cari *-Swift.hnama file di Build Settings (cari Objecter-C Generated Interface Header Name ). Namanya akan sepertiMyModule-Swift.h

Langkah 3: periksa apakah Test.mmengimpor header di atas

#import "MyModule-Swift.h"


1

Pastikan prototipe untuk metode unit Anda ada di file .h.

Karena Anda memanggil metode yang lebih tinggi dalam file daripada mendefinisikannya, Anda mendapatkan pesan ini. Atau, Anda dapat mengatur ulang metode Anda, sehingga penelepon lebih rendah dalam file daripada metode yang mereka panggil.


0

Ada dua pesan kesalahan terkait yang mungkin memberi tahu Anda ada sesuatu yang salah dengan deklarasi dan / atau impor.

Yang pertama adalah yang Anda maksud, yang dapat dihasilkan dengan TIDAK memasukkan #import di file .m (atau .pch) Anda saat mendeklarasikan kelas @ di file .h Anda.

Yang kedua Anda mungkin melihat, jika Anda memiliki metode di kelas States Anda seperti:

- (void)logout:(NSTimer *)timer

setelah menambahkan #import adalah ini:

Tidak ada @interface yang terlihat untuk "Negara" yang menyatakan pemilih 'logout:'

Jika Anda melihat ini, Anda perlu memeriksa dan melihat apakah Anda menyatakan metode "logout" Anda (dalam hal ini) dalam file .h dari kelas yang Anda impor atau peneruskan.

Jadi dalam kasus Anda, Anda memerlukan:

- (void)logout:(NSTimer *)timer;

di kelas States Anda .h untuk membuat satu atau kedua kesalahan terkait ini menghilang.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.