web-dev-qa-db-fra.com

Comment résoudre cette erreur? "la propriété avec l'attribut 'retenir (ou fort)' doit être de type objet"

J'ai travaillé sur une application toute la journée qui fonctionnait bien jusqu'à ce que Xcode télécharge des bibliothèques ou quelque chose comme ça, puis ça a commencé à avoir des problèmes. J'essaie simplement de créer les méthodes getter/setter pour extraire quelques tableaux de mon APPDelegate. Comme je l'ai dit, cela fonctionnait bien, puis au hasard, il est apparu avec cette erreur et ne sera plus construit:

property with 'retain(or strong)' attribute must be of object type

Voici le reste du code:

#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

Des idées? Cela m'a dérouté ....

Voici 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

Voici 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
30
Rob

Il semble que cela soit dû à l'inclusion récursive de fichiers d'en-tête.

Essayez d'ajouter @class Project et @class TeamMember dans votre Task.h, comme ceci

#import <Foundation/Foundation.h>
#import "Project.h"
#import "TeamMember.h"

@class TeamMember;
@class Project;

@interface Task : NSObject{
    NSDate *endDate;
    NSDate *startDate;
    ...
}
@end
56
Linghua Zhang

Vous essayez de conserver quelque chose qui n'est pas une sous-classe NSObject. Cela se produit généralement lorsque quelqu'un essaie de conserver un flottant ou un int.

NSInteger est un scalaire et non un objet. Vous ne devez donc pas le conserver, il doit être attribué. Changer votre propriété effacera le message d'avertissement. Vous n'avez pas besoin de faire les choses NSNumber que vous avez ajoutées.

@property (nonatomic, assign) NSInteger integValue;
36
Rajneesh071

L'erreur est que vous essayez de conserver quelque chose qui n'est pas une sous-classe NSObject. Cela se produit généralement lorsque quelqu'un essaie de retain a float ou int.

Vous avez affiché le .h pour Project mais pas pour TeamMember. Vérifiez ce dernier pour cela, et si vous ne le voyez pas, mettez à jour votre extrait de code.

6
PengOne

La réponse est déjà donnée Mais dans mon cas, la question était différente.

Je l'ai résolu d'une manière différente. Dans .h fichier Foundation framework est ajouté par défaut. Donc je commented la ligne et j'importe UIKit framework. Maintenant, je peux exécuter mon code.

//#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
1
Chandan

Cela m'est arrivé parce que j'ai importé récursivement des fichiers .h.

J'ai supprimé ces fichiers et mon projet a commencé à fonctionner.

1
Pratik Gujarati

N'écrivez pas la déclaration d'importation. Écrivez @class.

Exemple: - @class SecondViewController.

Merci

0
Mujahed Ansari