如何解决这个错误? “具有‘保留(或强)’属性的属性必须是对象类型”
Posted
技术标签:
【中文标题】如何解决这个错误? “具有‘保留(或强)’属性的属性必须是对象类型”【英文标题】:How to solve this error? "property with 'retain(or strong)' attribute must be of object type" 【发布时间】:2012-01-11 23:50:06 【问题描述】:我整天都在开发一个应用程序,它一直运行良好,直到 Xcode 下载了库或其他东西,然后它开始出现问题。我只是想创建 getter/setter 方法来从我的 APPDelegate 中获取几个数组。就像我说它工作正常,然后随机出现这个错误,现在不再构建:
property with 'retain(or strong)' attribute must be of object type
下面是剩下的代码:
#import <Foundation/Foundation.h>
#import "Project.h"
#import "TeamMember.h"
@interface Task : NSObject
NSDate *endDate;
NSDate *startDate;
NSMutableString* notes;
NSMutableString* taskName;
//The error appears first right here over teamMember
TeamMember *teamMember;
Project *project;
//The error appears over both of the following lines as well...
@property (nonatomic, retain)TeamMember *teamMember;
@property (nonatomic, retain) Project * project;
@property (nonatomic, retain) NSMutableString *notes;
@property (nonatomic, retain) NSMutableString *taskName;
@property (nonatomic, retain) NSDate *startDate;
@property (nonatomic, retain) NSDate *endDate;
@end
有什么想法吗?这让我很难过....
这里是 Project.h:
#import <Foundation/Foundation.h>
#import "Task.h"
@interface Project : NSObject
NSDate *dueDate;
NSDate *startDate;
NSArray *tasksInProject;
NSMutableString* notes;
NSMutableString* description;
NSMutableString* projectName;
@property (nonatomic, retain) NSDate *startDate;
@property (nonatomic, retain) NSDate *dueDate;
@property (nonatomic, retain) NSArray *tasksInProject;
@property (nonatomic, retain) NSMutableString *description;
@property (nonatomic, retain) NSMutableString *projectName;
@end
这是 TeamMember.h
#import <Foundation/Foundation.h>
#import "Task.h"
#import "Project.h"
@interface TeamMember : NSObject
NSMutableArray *projects;
NSMutableString *name;
NSMutableString *title;
NSMutableString *email;
NSMutableString *phone;
NSMutableString *notes;
//@property(nonatomic, retain) NSArray *projects;
@property (nonatomic, retain) NSMutableString *name;
@property (nonatomic, retain) NSMutableString *title;
@property (nonatomic, retain) NSMutableString *email;
@property (nonatomic, retain) NSMutableString *phone;
@property (nonatomic, retain) NSMutableString *notes;
@end
【问题讨论】:
【参考方案1】:看起来是递归包含头文件引起的。
尝试将@class Project 和@class TeamMember 添加到您的Task.h 中,像这样
#import <Foundation/Foundation.h>
#import "Project.h"
#import "TeamMember.h"
@class TeamMember;
@class Project;
@interface Task : NSObject
NSDate *endDate;
NSDate *startDate;
...
@end
【讨论】:
+1 但您还应该说明 Project.h 和 TeamMember.h 的#import
s 应该移动到 Task.m,因为前向声明已经到位 - 循环依赖已经还没坏呢!
所以只是为了澄清这一点,我有一个类似的项目,但我不认为自己在做循环依赖,但如果我添加类它就会消失(我想因为我告诉它它是一个类)应该我只是将这个类的标题添加到 M 文件中,然后将其作为属性与 H 文件上的@class 一起保留?【参考方案2】:
您试图保留不是 NSObject 子类的东西。这通常发生在有人试图保留浮点数或整数时。
NSInteger 是一个标量而不是一个对象。所以你不应该保留它,它应该被分配。更改您的属性将清除警告消息。你不需要做你添加的 NSNumber 的东西。
@property (nonatomic, assign) NSInteger integValue;
【讨论】:
【参考方案3】:错误是您试图保留不是NSObject
子类的内容。这通常发生在有人尝试retain
float
或int
时。
您已经为Project
显示了.h,但没有为TeamMember
显示。检查后者,如果您没有看到,请更新您的代码 sn-p。
【讨论】:
我看了看,它们都继承自 Object...我编辑了代码以包含两者。我刚刚注意到它还说“未知类型名称 TeamMember 作为错误...【参考方案4】:这发生在我身上,因为我递归地导入了一些 .h 文件。
我删除了这些文件,我的项目开始工作了。
【讨论】:
【参考方案5】:答案已经给出,但在我的情况下,问题是不同的。
我以不同的方式解决了它。在.h
文件中默认添加Foundation framework
。所以我commented
这条线并导入UIKit framework
。现在我可以运行我的代码了。
//#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
【讨论】:
【参考方案6】:如果我们自定义一个View,在ViewController中使用IBOutlet 我们只需在 ViewController
中像这样导入 custom view 的标头#import "abc.h"
这确实有效
【讨论】:
【参考方案7】:不要写导入语句。 写@class。
示例:- @class SecondViewController。
谢谢
【讨论】:
以上是关于如何解决这个错误? “具有‘保留(或强)’属性的属性必须是对象类型”的主要内容,如果未能解决你的问题,请参考以下文章