【问题标题】:My @property is declared yet I still get may not respond to warning我的@property 已声明但我仍然得到可能无法响应警告
【发布时间】:2011-09-21 21:08:01
【问题描述】:

我不喜欢到处乱扔警告,而这个警告一直困扰着我。关于我做错了什么的任何想法?我有大量使用相同方法的属性,但它们都没有给我警告。为什么 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

我觉得我一定错过了一些非常简单的东西。

【问题讨论】:

    标签: iphone ios properties


    【解决方案1】:

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

    • 检查循环导入。

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

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

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

    【讨论】:

    • 没有重复的 OnlinePeerBrowser.h。 WelcomeViewController.m 包括 WelcomeViewController.h 和 OnlinePeerBrowser.h。 OnlinePeerBrowser.h 包括 WelcomeViewController.h。所以它是圆形的。现在是一个非常愚蠢的问题 - 我如何在 Xcode 4.2 中查看完整的构建日志?我在问题导航器中显示警告;但是,这是口译员吧?
    • 达伦,你引导我找到答案......我有导入而不是包含。嗬!切换到包含使 Xcode 处理循环依赖。那是 C++ 中的一件事让我很生气#ifdef。你能更新你的答案,我会检查它。
    • 构建日志在日志导航器 (Command+7) 中可用。我已经为您的循环导入问题更新了答案。
    • 您想使用#import,而不是#include。使用#import,您不必担心用#ifdef 保护标头,但也不必处理循环依赖。为此,您需要使用前向类声明。
    • 所以基本上你是说如果我使用#include 并将其留给 Xcode 来处理循环依赖项,我就是在作弊。正确的做法是使用@class WelcomeViewController。谢谢你让我成为一个更好的程序员;)-
    【解决方案2】:

    有时循环导入会导致编译器出现问题。 而不是使用

    #import "WelcomeViewController.h"
    

    在 OnlinePeerBrowser.h 中将该行移至 OnlinePeerBrowser.m 并添加

    @class WelcomeViewController
    

    到 OnlinePeerBrowser.h

    这将允许您将 myParent 和 _myParent 的 Class 设置为 WelcomeViewController 并且没有循环导入。

    或者

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

    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
    

    【讨论】:

    • 感谢 Volure DarkAngel @Darren 已经为我回答了根本问题。但我同意你的观点,有时协议是最佳选择。我会为你向上箭头。我不想为了得到父母而走到这种程度。模态视图通常应该有父视图,但我发现了一个我认为 bit.ly/obMWSX 的错误
    • 没问题。我可以尊重 :) 我认为他在我创建这篇文章时回答了它,所以虽然我有更多信息和其他细节,但他确实提供了一些很好的调试技巧,并用简洁的解决方案回答了你的问题 :) 感谢您的投票。
    猜你喜欢
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 2020-11-16
    • 1970-01-01
    • 2017-10-28
    • 1970-01-01
    • 1970-01-01
    • 2011-11-06
    相关资源
    最近更新 更多