Xcode iPhone:属性......需要方法...定义 - 使用@syntehsize,@ dynamic或提供方法实现

时间:2011-08-22 23:27:09

标签: iphone ios xcode

<。>在.m文件中,我有4个与一个命令相关的警告:

@end

  • 属性'myHeader'需要定义方法'-myHeader' - 使用@synthesize,@ dynamic或提供方法实现

  • 属性'customCell'需要定义'setCustomCell:'方法 - 使用@synthesize,@ dynamic或提供方法实现

  • 属性'customCell'需要定义方法'-customCell' - 使用@synthesize,@ dynamic或提供方法实现

  • 属性'myHeader'需要定义'setMyHeader'方法 - 使用@synthesize,@ dynamic或提供方法实现

我浏览了论坛,但到目前为止我无望 - 你能解释一下(初学者程序员......)如何调试它?万分感谢!

7 个答案:

答案 0 :(得分:13)

复苏旧线程。可能不是OP问题,但我认为值得一提的是,以防其他人(像我一样)碰到这个。如果您在类类别中实现新属性,则会收到相同的消息(如果您使用的LLVM 4不再需要@synthesize,则会感到困惑)。这可以使用here概述的技术:

@interface SomeClass (Private)
@property (nonatomic, assign) id newProperty;
@end
NSString * const kNewPropertyKey = @"kNewPropertyKey";
@implementation SomeClass (Private)
@dynamic newProperty;
- (void)setNewProperty:(id)aObject
{
    objc_setAssociatedObject(self, kNewPropertyKey, aObject, OBJC_ASSOCIATION_ASSIGN);
}
- (id)newProperty
{
    return objc_getAssociatedObject(self, kNewPropertyKey);
}
@end

答案 1 :(得分:10)

这意味着您需要合成这些变量。合成为您创建setter和getter方法。为此,您需要在实现(.m)文件中包含以下代码:

@synthesize myHeader;
@synthesize customCell;

添加这些行应该处理4个错误。

您也可以选择自己定义setter和getter方法,但除非您想要执行某些特定操作,否则请立即使用@synthesize。

答案 2 :(得分:7)

在您的班级标题(相关联的.h文件)中,您显然有类似以下内容的内容:

@property SomeClass *myHeader;
@property SomeClass *customCell;

这告诉编译器您希望您的类具有这些属性,但您仍然必须告诉它如何获取和设置实例上的值。您有三种选择:

  1. 在@implementation部分(在.m文件中),您可以添加

    @synthesize myHeader, customCell;
    

    告诉编译器自动生成获取和设置这些属性的方法。这是最简单的,通常也是你想要的。

  2. 您可以自己实现这些方法:

    - (SomeClass *)myHeader
    {
        // Return the value of myHeader
    }
    
    - (void)setMyHeader:(SomeClass *)inMyHeader
    {
        // Set myHeader to inMyHeader
    }
    

    这通常用于派生或动态生成的属性,或者当您想要在更改时执行额外工作时。

  3. 您可以使用@dynamic myHeader, customCell;告诉编译器将在运行时提供实现。这很少使用。

答案 3 :(得分:3)

使用@property告诉编译器您打算通过“setter”和“getter”函数访问相应的成员变量,即更改变量值或返回其值的函数。您看到的警告是因为您尚未定义所需的功能。我猜你的标题(.h)文件看起来像这样:

@property(readwrite, assign) <type> myHeader;
@property(readwrite, assign) <type> customCell;

因为您告诉编译器这些变量应该可以通过setter和getter函数访问,所以您需要定义这些函数。有两种方法可以做到这一点。最简单的方法是使用@synthesize,将以下内容添加到您的实现(.m)文件中:

@synthesize myHeader;
@synthesize customCell;

@synthesize行会导致在编译时自动生成- myHeader- setMyHeader- customCell- setCustomCell方法。您也可以手动定义这些方法,但这样做通常是不必要的。

Here's a page with more information about properties in Objective C

答案 4 :(得分:1)

您在@property语句中定义了两个ivars,但是您缺少匹配的@synthesize语句。将@synthesize添加到类定义中。

答案 5 :(得分:0)

你已经声明了一个@property - 这实际上是一个合同,说你将实现getter和setter方法,但是你没有。你需要:

  • 为每个媒体实施-foo-setFoo:,或
  • .m文件中使用@synthesize,编译器会为您完成。

更多信息可在文档here中找到。

答案 6 :(得分:0)

你有一些选择,但最简单的,也许你想要的是使用@synthesize。

在你的.m文件中,在@implementation之后的某处,添加

@synthesize myHeader;

同样适用于其他财产。

为了使其工作,您的类还必须有一个名为myHeader的成员变量。你可能已经拥有了。如果没有,在.h文件中,在@interface之后的某处,放

SomeType *myHeader;

当然将“SomeType”更改为与您在属性声明中相同的相应类型(您拥有的东西看起来像)

@property (retain) SomeType *myHeader;