我刚开始使用delegates
。
由于某些原因我无法做到,我看到了错误。
我尝试在新项目上执行下一个代码并且没关系,但是当我将此代码移动到我的主项目时,我遇到了一些问题。
我的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
问题解决了。
答案 0 :(得分:2)
我们无法看到所有代码,但在阅读了更多的交换后,看起来依赖关系可能会无序添加。我建议将协议移动到自己的文件中,并将#import导入到使用它的所有地方。这样你肯定会按照你期望的顺序导入东西。
除此之外,还有以下属性声明:
@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)
现在,如果两种方式的关系都是STRONG,那么从拥有它的所有人那里释放父母将不足以释放它,因为它的孩子也与它拥有自己的关系。
您也可以省略:
@synthesize delegate;
自动属性合成使此过时。
答案 1 :(得分:1)
确保将NSObject
类.h.
文件导入UIViewController
的{{1}}文件(或您声明协议的任何位置)。就目前而言,您尚未导入声明协议的标头,因此您的视图控制器无法知道它是否存在。
例如:
.h
答案 2 :(得分:-1)
在视图控制器.h文件中,尝试添加以下行:
@protocol MyNSObjectClassDelegate;
前
@interface ...