20

我对目标 c 很陌生,并且遇到了一些基本问题。

我使用导航器编写了一个简单的程序,一切正常。然后我添加了几行代码(甚至不记得到底是什么,而且似乎与问题无关)并且问题发生了。我试过ctrl+z,问题依旧:

我运行程序并得到这些错误:

1. unknown type name "mainController"
2. property with 'retain (or strong)' attribute must be of object type

而 mainController 是要加载的第一个屏幕。

这是 appDelegate.h 文件:

#import <UIKit/UIKit.h>
#import "mainController.h"
#import "WishesList.h"
#import "Wish.h"

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;
@property (strong, nonatomic) IBOutlet UINavigationController *navController;
@property (strong, nonatomic) IBOutlet mainController *viewController; // this line creates the errors
@property (strong, nonatomic) WishesList *WishesArray;
@property (strong, nonatomic) NSIndexPath *temp;

@end

这是 appDelegate.m 文件的相关部分:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:    (NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc]initWithFrame:[[UIScreen mainScreen]bounds]];
    WishesArray = [[WishesList alloc]init];
    temp = nil;
    [self setViewController:[[mainController alloc]init]];
    [self setNavController:[[UINavigationController alloc]initWithRootViewController:self.viewController]];
    [self.window setRootViewController:navController];
    [self.window makeKeyAndVisible];
    return YES;
}

这是 mainController.h:

#import <UIKit/UIKit.h>
#import "addWishController.h"
#import "displayWish.h"
#import "WishesList.h"
#import "Wish.h"

@interface mainController : UIViewController

@property (nonatomic, weak) WishesList *list;
@property (nonatomic, strong) IBOutlet UITableView *wishTable;

- (void)addWish;

@end

它已经工作了......
你能弄清楚吗?

谢谢

4

6 回答 6

35

我发现,如果你有一个导入周期,也会出现同样的错误:

类_A.h:#import "Class_B.h"

Class_B.h:#import "Class_A.h"

修复:查找违规类的任何导入(错误选项卡是您的朋友,展开相关错误以获取导入列表)。#import相应地删除

于 2012-05-28T11:44:05.530 回答
19

这个问题发生在我身上一次。

我在我的 h 文件中导入“APPDelegate.h”,在我的 APPDelegate.h 中我也在导入该文件(这应该不是问题,但是......)

我做了什么:我将 Import 从我自己的 .h 更改为 .m 并且它起作用了:)

于 2012-05-23T09:00:23.117 回答
4

正如其他人所提到的,这确实是由循环进口造成的。要解决此问题,请删除其中一个类中的导入。但有时这还不够。如果这些类相互依赖,只需在另一个类中前向声明一个类:

A类:

#import <UIKit/UIKit.h>
@class B; //<- this is essential here

@interface A: NSObject

@property(nonatomic, strong) B *b;
//...

在 B 类中,我们有:

#import "A.h"
@interface B: NSObject

@property(nonatomic, strong) A *a;
于 2016-12-12T18:27:51.017 回答
1

@JustAStranger 和@NathanielSymer,都是正确的!

无论如何,值得记住的是,下面的这个案例也有同样的问题:

类_A.h:#import "Class_B.h"

Class_B.h:#import "Class_C.h"

类_C.h:#import "Class_A.h"

这个问题向我们揭示了在我们的类关系中照顾所有者的重要性。使用 ObjC 标头很容易产生循环问题。

于 2014-03-20T18:31:34.610 回答
0

检查目标及其正在编译的文件。也许 mainController 已经从该目标中删除了一些方法。如果是这样,在构建时,您会收到找不到它的消息。

于 2012-01-10T23:58:54.360 回答
-1

这个问题看起来像是一个错字,因为类名通常以大写字符开头。因此,mainController 可以/应该是 MainController。检查类名以查看错误是否确实是拼写错误,因为编译器告诉您它找不到任何名为 mainController 的类。

于 2012-01-10T10:00:37.880 回答