我的@property已经宣布但我仍然可能没有回应警告

时间:2011-09-21 21:08:02

标签: iphone ios properties

我不喜欢躺着的警告,这个一直困扰着我。关于我做错了什么的任何想法?我有很多使用同样方法的属性,但没有一个给我警告。为什么Xcode不识别这个?

当应用程序按预期工作时,Xcode给了我以下编译时警告:

'OnlinePeerBrowser' may not respond to '-setMyParent:'

我在OnlinePeerBrowser.h中的属性声明

#import "WelcomeViewController.h"

@interface OnlinePeerBrowser : UIViewController <UITableViewDelegate, UITableViewDataSource, NSNetServiceBrowserDelegate> {

    WelcomeViewController *_myParent;
}

@property (nonatomic, assign) WelcomeViewController *myParent;

OnlinePeerBrowser.m有

@synthesize myParent=_myParent;

我在WelcomeViewController.m中的setMyParent上收到警告......

#import "WelcomeViewController.h"
#import "OnlinePeerBrowser.h"

@implementation WelcomeViewController

- (void)peerPickerController:(GKPeerPickerController *)picker didSelectConnectionType:(GKPeerPickerConnectionType)type {
... 

    OnlinePeerBrowser *controller = [[OnlinePeerBrowser alloc] 
                                     initWithNibName:@"OnlinePeerBrowser" bundle:nil];
    [controller setMyParent:self];
}

另外,奇怪的是我不能在这里使用点语法。

controller.myParent = self; 

给了我以下错误:

/Users/vesselhead/Development/iPhone/DJBox/WelcomeViewController.m:254: error: request for member 'myParent' in something not a structure or union

我觉得我必须遗漏一些非常简单的东西。

2 个答案:

答案 0 :(得分:2)

您发布的代码看起来是正确的。这意味着编译器正在从某个地方引入OnlinePeerBrowser类的另一个声明。

  • 检查循环导入。

  • 检查您是否拥有OnlinePeerBrowser.h文件的多个副本。

  • 将行#warning Testing添加到OnlinePeerBrowser.h文件中。编译时,该警告应出现在日志中。如果没有出现该警告,则编译器不会接收该文件。

如果是循环导入,则不要在“OnlinePeerBrowser.h”中导入“WelcomeViewController.h”。相反,在OnlinePeerBrowser.h中使用前向声明,例如@class WelcomeViewController,并在OnlinePeerBrowser.m中导入“WelcomeViewController.h”

答案 1 :(得分:1)

有时,Circular Imports会在编译器中产生问题。 而不是使用

#import "WelcomeViewController.h"
在OnlinePeerBrowser.h中

将该行移动到OnlinePeerBrowser.m并添加

@class WelcomeViewController

到OnlinePeerBrowser.h

这将允许您将myParent和_myParent的类设置为WelcomeViewController,而不是循环导入。

<强>替代地

您可能想要使用WeclomeViewController必须遵守的@protocol。然后你只需要在一个方向上导入类。

协议属性的实现将如下所示

//#import "WelcomeViewController.h"

@protocol OnlinePeerBrowserParent <NSObject>
@required
- (NSString*) informationFromParent;
@end


@interface OnlinePeerBrowser : UIViewController <UITableViewDelegate, UITableViewDataSource, NSNetServiceBrowserDelegate> {

    id<OnlinePeerBrowserParent> _myParent;
}

@property (nonatomic, assign) id<OnlinePeerBrowserParent> myParent;

注意协议在OnlinePeerBrowser.h上,因此您可以导入OnlinePeerBrowser.h并默认获取协议。

最后你在WelcomeViewController中实现了这样的协议

@implementation WelcomeViewController<OnlinePeerBrowserParent>

- (NSString*) informationFromParent
{
    return @"My Parental Info";
}

...... etc