@end
属性'myHeader'需要定义方法'-myHeader' - 使用@synthesize,@ dynamic或提供方法实现
属性'customCell'需要定义'setCustomCell:'方法 - 使用@synthesize,@ dynamic或提供方法实现
属性'customCell'需要定义方法'-customCell' - 使用@synthesize,@ dynamic或提供方法实现
属性'myHeader'需要定义'setMyHeader'方法 - 使用@synthesize,@ dynamic或提供方法实现
我浏览了论坛,但到目前为止我无望 - 你能解释一下(初学者程序员......)如何调试它?万分感谢!
答案 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;
这告诉编译器您希望您的类具有这些属性,但您仍然必须告诉它如何获取和设置实例上的值。您有三种选择:
在@implementation部分(在.m文件中),您可以添加
@synthesize myHeader, customCell;
告诉编译器自动生成获取和设置这些属性的方法。这是最简单的,通常也是你想要的。
您可以自己实现这些方法:
- (SomeClass *)myHeader
{
// Return the value of myHeader
}
- (void)setMyHeader:(SomeClass *)inMyHeader
{
// Set myHeader to inMyHeader
}
这通常用于派生或动态生成的属性,或者当您想要在更改时执行额外工作时。
您可以使用@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;