loại người nhận *** ví dụ tin nhắn là một tuyên bố chuyển tiếp


199

Trong ứng dụng iOS5 của tôi, tôi có NSObject Stateslớp và cố gắng khởi tạo nó:

states = [states init];

đây là initphương pháp trong States:

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

    return self;
}

Nhưng có lỗi trong dòng states = [states init];

loại nhận "thông báo" ví dụ là một tuyên bố chuyển tiếp

Nó có nghĩa là gì? Tôi đang làm gì sai?


Tôi đã cố gắng để hoàn thành cùng một câu hỏi, nhưng có mỗi giải pháp khác nhau trong mỗi tham. Tôi bối rối một chút
SentineL

3
Câu trả lời rất ngắn là bạn đang thiếu #import (có lẽ trong tệp Tiền tố của bạn) hoặc bạn đang thiếu "@group Abc;" dòng (tức là trong tệp .h ngay phía trên dòng @interface)
Fattie

Câu trả lời:


440

Điều đó về cơ bản có nghĩa là bạn cần nhập tệp .h có chứa khai báo của các quốc gia.

Tuy nhiên, có rất nhiều thứ khác sai với mã của bạn.

  • Bạn đang - đang là một đối tượng mà không +alloc'ing nó. Điều đó sẽ không làm việc
  • Bạn đang khai báo một đối tượng là một loại con trỏ, nó sẽ không hoạt động
  • Bạn sẽ không gọi [super init]trong-init .
  • Bạn đã khai báo lớp sử dụng @classtrong tiêu đề, nhưng không bao giờ nhập lớp.

Điều này hơi lạ một chút vì trong trường hợp của tôi, tôi vừa xóa .htệp vì vấn đề tham chiếu vòng tròn.
Alper

Thật là một từ ngữ hoàn toàn vô lý. Nhưng, vâng, nó đã sửa nó.
TimJowers2

Nếu bạn đang cố gắng sử dụng các đối tượng Swift trong Objective-C, đừng quên họ phải kế thừa từ đó NSObject.
Michal růtek

27

FWIW, tôi đã gặp lỗi này khi tôi đang triển khai dữ liệu cốt lõi cho một dự án hiện có. Hóa ra tôi đã quên liên kết CoreData.h với dự án của mình. Tôi đã thêm khung CoreData vào dự án của mình nhưng đã giải quyết vấn đề bằng cách liên kết với khung trong tiêu đề được biên dịch trước giống như các mẫu của Apple làm:

#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
Thật là xấu hổ khi gần như tất cả các hướng dẫn CoreData bắt đầu với việc sử dụng mẫu nhưng không phải với một dự án hiện có. Nó khá dễ dàng để làm sai ở đây.
Yeung

24

Tôi nhận được loại tin nhắn này khi tôi có hai tập tin phụ thuộc vào nhau. Điều khó khăn ở đây là bạn sẽ có được một tham chiếu vòng tròn nếu bạn chỉ cố gắng nhập lẫn nhau (lớp A nhập lớp B, lớp B nhập lớp A) từ các tệp tiêu đề của họ. Vì vậy, những gì bạn sẽ làm là thay vào đó đặt một @class Akhai báo về phía trước ( ) trong một trong các tệp tiêu đề của lớp (lớp B). Tuy nhiên, khi cố gắng sử dụng ngà của lớp A trong quá trình triển khai lớp B, chính lỗi này xuất hiện, chỉ thêm một #import "A.h"tệp trong tệp .m của lớp B đã khắc phục sự cố cho tôi.


16

Tôi đã cố gắng để sử dụng @class "Myclass.h".

Khi tôi thay đổi nó #import "Myclass.h", nó hoạt động tốt.


Chỉ cần một lưu ý phụ ở đây: @class "Myclass.h"là hoàn toàn không chính xác. @class Myclassnên được sử dụng trong tệp tiêu đề trong đó lớp không thể được nhập (do tham chiếu vòng tròn, chẳng hạn như sẽ xảy ra với lớp được xác định Swift trong Objective-C) nhưng #import "Myclass.h"nên được sử dụng nếu có thể được nhập.
Người dùng không phải là người dùng

6

Bạn đang sử dụng

States states;

bạn nên sử dụng ở đâu

States *states;

Phương thức init của bạn nên như thế này

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

Bây giờ cuối cùng khi bạn sẽ tạo một đối tượng cho lớp States, bạn nên làm nó như thế này.

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

Tôi không nói rằng đây là cách tốt nhất để làm điều này. Nhưng nó có thể giúp bạn hiểu cách sử dụng rất cơ bản của việc khởi tạo các đối tượng.


5

Nếu bạn gặp phải lỗi này trong khi thử sử dụng lớp hoặc phương thức Swift trong Mục tiêu C : bạn đã quên một trong 2 bước được Apple xác định trên sơ đồ này:

nhập mô tả hình ảnh ở đây

Thí dụ:

Lỗi xuất hiện trong Test.mtệp của bạn :

Người nhận 'MyClass' cho thông báo lớp là một tuyên bố chuyển tiếp

Bước 1: kiểm tra xem Test.h

@class MyClass;

Bước 2: tìm *-Swift.htên tệp trong Cài đặt bản dựng (tìm Tên tiêu đề giao diện được tạo Objective-C ). Tên sẽ giống nhưMyModule-Swift.h

Bước 3: kiểm tra xem Test.mnhập tiêu đề trên

#import "MyModule-Swift.h"

3

Kiểm tra xem bạn đã nhập các tệp tiêu đề của các lớp đang ném lỗi này chưa.


1

Đảm bảo nguyên mẫu cho phương thức đơn vị của bạn nằm trong tệp .h.

Vì bạn đang gọi phương thức trong tệp cao hơn so với định nghĩa của bạn, nên bạn nhận được thông báo này. Ngoài ra, bạn có thể sắp xếp lại các phương thức của mình để người gọi trong tệp thấp hơn các phương thức họ gọi.


0

Có hai thông báo lỗi liên quan có thể cho bạn biết có gì đó không đúng với khai báo và / hoặc nhập.

Đầu tiên là cái mà bạn đang đề cập đến, có thể được tạo bằng cách KHÔNG đặt #import vào tệp .m (hoặc .pch) của bạn trong khi khai báo @ class trong .h của bạn.

Thứ hai bạn có thể thấy, nếu bạn có một phương thức trong lớp States của bạn như:

- (void)logout:(NSTimer *)timer

sau khi thêm #import là đây:

Không thấy @interface cho "States" tuyên bố bộ chọn 'logout:'

Nếu bạn thấy điều này, bạn cần kiểm tra và xem nếu bạn đã khai báo phương thức "đăng xuất" (trong trường hợp này) trong tệp .h của lớp bạn đang nhập hoặc chuyển tiếp.

Vì vậy, trong trường hợp của bạn, bạn sẽ cần một:

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

trong lớp .h của bạn để làm cho một hoặc cả hai lỗi liên quan này biến mất.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.