如何解决这个错误? “具有‘保留(或强)’属性的属性必须是对象类型”

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 的 #imports 应该移动到 Task.m,因为前向声明已经到位 - 循环依赖已经还没坏呢! 所以只是为了澄清这一点,我有一个类似的项目,但我不认为自己在做循环依赖,但如果我添加类它就会消失(我想因为我告诉它它是一个类)应该我只是将这个类的标题添加到 M 文件中,然后将其作为属性与 H 文件上的@class 一起保留?【参考方案2】:

您试图保留不是 NSObject 子类的东西。这通常发生在有人试图保留浮点数或整数时。

NSInteger 是一个标量而不是一个对象。所以你不应该保留它,它应该被分配。更改您的属性将清除警告消息。你不需要做你添加的 NSNumber 的东西。

@property (nonatomic, assign) NSInteger integValue;

【讨论】:

【参考方案3】:

错误是您试图保留不是NSObject 子类的内容。这通常发生在有人尝试retainfloatint 时。

您已经为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。

谢谢

【讨论】:

以上是关于如何解决这个错误? “具有‘保留(或强)’属性的属性必须是对象类型”的主要内容,如果未能解决你的问题,请参考以下文章

我该如何解决这个错误,它的原因是啥?

如何解决 vb.net 中的这个 SQL 语法错误?

我该如何解决这个 composer.json 错误

类型错误,我该如何解决这个错误,在图片中我写了我的具体问题

如何解决这个 C++ 向量排序错误?

npm 错误!代码 1.为啥这个错误消息会发生 npm ERR!代码1?我该如何解决