2014-10-09 48 views
-1

我刚刚开始使用delegatesObjective C - 无法设置委托错误 - 找不到'myNSObjectClassDelegate'的协议声明

由于某种原因,我无法做到这一点,我看到错误。

我试着做一个新项目的下一个代码,它是好的,但是当我将这段代码移动到我的主项目时,我遇到了一些问题。

NSObject.h类:

@protocol myNSObjectClassDelegate <NSObject> 

@required 
-(void)doSomething; 

@end 


@interface GeneralMethods : NSObject 

@property (nonatomic,strong) id<myNSObjectClassDelegate> delegate; 

@end 

NSObject.m

@synthesize delegate; 

-(void)SomeMethod { 
    if ([delegate respondsToSelector:@selector(doSomething)]) { 
     [delegate doSomething]; 
    } 
} 

UIViewController.h

#import "GeneralMethods.h" 

@interface view : UIViewController<UIGestureRecognizerDelegate, 
            UINavigationControllerDelegate, 
             UIImagePickerControllerDelegate, 
            myNSObjectClassDelegate> 

的错误是在这里.h - Cannot find protocol declaration for 'myNSObjectClassDelegate'

UIViewController.m

-(void)doSomething{ 
} 

我在做什么错?

编辑:我弄明白: 出于某种原因,在我NSObject类,如果我移动在此之后,#import myUIViewcontroller

@protocol myNSObjectClassDelegate <NSObject> 

@required 
-(void)doSomething; 

@end 

的问题就迎刃而解了。

+3

与您的问题无关,但您最好使您的班级和协议名称大写。这是一个通用的约定 – 2014-10-09 16:02:57

+0

好的谢谢:) – 2014-10-09 16:06:05

+2

一般来说,你不应该维护与委托协议的“强”关系。 – 2014-10-09 16:23:56

回答

1

确保将您的NSObject.h.文件导入到您的UIViewController.h文件(或任何您声明协议的地方)。就目前而言,您尚未导入声明协议的标头,因此您的视图控制器无法知道它存在。

例:

#import "FileWithProtocol.h" 

@interface MyClass <MyProtocol> 

... 

@end 
+0

我不确定 - 虽然他没有真正显示它,但预计他的视图控制器的'.m'文件会导入相应的'.h'文件,该文件包含协议的导入。 – 2014-10-09 16:08:29

+0

如果他在实现文件中导入它,头文件仍然无法找到它。 – 2014-10-09 16:28:02

+0

对,我在说 - 头文件应该导入协议。 (在他的代码片段中,它似乎已经看上去了)。实现文件应该导入标题。 OP的类名称很混乱,但好像'view.h'应该导入'GeneralMethods.h','view.m'应该导入'view.h'。但似乎他应该已经这样做了...... – 2014-10-09 16:42:44

-1

在视图控制器的.h文件,尝试加入这一行:

@protocol MyNSObjectClassDelegate; 

@interface ... 
+0

编译器仍然会警告未声明的协议。 – 2014-10-09 16:28:21

+0

但他已经在#import“GeneralMethods.h”中的代码片段中导入了协议文件。无论如何,他解决了它... – 2014-10-10 09:58:14

2

我们不能看到所有的代码,但在阅读了一些更多的交流之后,看起来依赖关系可能会不按顺序添加。我建议将协议移到它自己的文件中,并将它导入所有使用它的地方。这样你肯定会按照你期望的顺序导入东西。

除此之外,下列财产申报:

@property (nonatomic,strong) id<myNSObjectClassDelegate> delegate; 

代表应被声明为弱,不强。

@property (nonatomic,weak) id<myNSObjectClassDelegate> delegate; 

原因是为了避免保留周期/内存泄漏。通常情况下,虽然不总是的关系是这样的:

Parent Object (usually Controller) -----STRONG-----> Child (View often) 
View Thing ----WEAK--------> delegate (actually the Parent Object) 

现在,如果关系是牢固的两种方式,释放所有谁拥有它并不足以将其释放父,因为它的孩子也拥有一个所属关系到它。你

还可以省略:

@synthesize delegate; 

自动合成属性呈现此过时。