Objective C - 无法设置委托错误 - 找不到'myNSObjectClassDelegate'的协议声明
我刚刚开始使用delegates
。Objective 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
的问题就迎刃而解了。
确保将您的NSObject
类.h.
文件导入到您的UIViewController
的.h
文件(或任何您声明协议的地方)。就目前而言,您尚未导入声明协议的标头,因此您的视图控制器无法知道它存在。
例:
#import "FileWithProtocol.h"
@interface MyClass <MyProtocol>
...
@end
我不确定 - 虽然他没有真正显示它,但预计他的视图控制器的'.m'文件会导入相应的'.h'文件,该文件包含协议的导入。 – 2014-10-09 16:08:29
如果他在实现文件中导入它,头文件仍然无法找到它。 – 2014-10-09 16:28:02
对,我在说 - 头文件应该导入协议。 (在他的代码片段中,它似乎已经看上去了)。实现文件应该导入标题。 OP的类名称很混乱,但好像'view.h'应该导入'GeneralMethods.h','view.m'应该导入'view.h'。但似乎他应该已经这样做了...... – 2014-10-09 16:42:44
在视图控制器的.h文件,尝试加入这一行:
@protocol MyNSObjectClassDelegate;
前
@interface ...
编译器仍然会警告未声明的协议。 – 2014-10-09 16:28:21
但他已经在#import“GeneralMethods.h”中的代码片段中导入了协议文件。无论如何,他解决了它... – 2014-10-10 09:58:14
我们不能看到所有的代码,但在阅读了一些更多的交流之后,看起来依赖关系可能会不按顺序添加。我建议将协议移到它自己的文件中,并将它导入所有使用它的地方。这样你肯定会按照你期望的顺序导入东西。
除此之外,下列财产申报:
@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;
自动合成属性呈现此过时。
与您的问题无关,但您最好使您的班级和协议名称大写。这是一个通用的约定 – 2014-10-09 16:02:57
好的谢谢:) – 2014-10-09 16:06:05
一般来说,你不应该维护与委托协议的“强”关系。 – 2014-10-09 16:23:56