How to solve this error? "property with 'retain(or strong)' attribute must be of object type" - iphone

I have been working on an app all day which has been working fine until Xcode downloaded libraries or something and then it started having issues. I am just trying to create the getter/setter methods to get a couple of arrays out of my APPDelegate. Like I said it was working fine and then randomly it showed up with this error and now won't build anymore:
property with 'retain(or strong)' attribute must be of object type
Here is the rest of the 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
Any ideas? This has got me stumped....
Here is 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
Here is 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

It looks like it's caused by recursively including of header files.
Try to add #class Project and #class TeamMember into your Task.h, like this
#import <Foundation/Foundation.h>
#import "Project.h"
#import "TeamMember.h"
#class TeamMember;
#class Project;
#interface Task : NSObject{
NSDate *endDate;
NSDate *startDate;
...
}
#end

You are attempting to retain something that is not an NSObject subclass. Usually this happens when someone tries to retain a float or int.
NSInteger is a scalar and not an object. So you shouldn't retain it, it should be assigned. Changing your property will clear up the warning message. You don't need to do the NSNumber stuff that you added in.
#property (nonatomic, assign) NSInteger integValue;

The error is that you are attempting to retain something that is not an NSObject subclass. Usually this happens when someone tries to retain a float or int.
You've shown the .h for Project but not for TeamMember. Check the latter for this, and if you don't see it then update your code snippet.

It happened to me because i have recursively imported some .h files.
I removed those files and my project started working.

Answer is already given But in my case the issue was different.
I resolved it in a different way. In .h file Foundation framework is added by default. So i commented the line and import UIKit framework. Now i am able to run my code.
//#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

In case we custom a View, to use IBOutlet in ViewController
we simply import header of custom view like this in our ViewController
#import "abc.h"
this works for sure

Don't Write import statement .
Write #class.
Example :-
#class SecondViewController.
Thanks

Related

Under IOS5, using ARC while creating my own delegate, error regarding using _weak

In my .h file I have this:
#protocol ScanBookDelegate
- (void)MethodNameToCallBack:(NSArray *)s;
#end
#property (nonatomic, weak) id <ScanBookDelegate> delegate;
In my .m file I have:
#synthesize delegate;
I get this error:
Existing ivar 'delegate' for __weak property 'delegate' must be __weak
How do I resolve this error?
I am returning an NSArray * as I am returning data from a JSON result.
UPDATE:
Here is my entire .h file -
#import <UIKit/UIKit.h>
#protocol ScanBookDelegate
- (void)MethodNameToCallBack:(NSArray *)s;
#end
#interface jabBookScan : NSObject
<NSURLConnectionDelegate, NSURLConnectionDataDelegate>
{
NSURLConnection *internalConnection;
NSMutableData *container;
id <ScanBookDelegate> delegate;
}
- (id)initWithRequest:(NSURLRequest *)req;
- (void)start;
- (NSMutableData *) lookupBook:(NSString *) isbn;
- (void)fetchedData:(NSData *)responseData;
#property (nonatomic, copy) NSURLRequest *request;
#property (nonatomic, copy) void (^completionBlock)(id obj, NSError *err);
#property (nonatomic, strong) NSDictionary *jsonRootObject;
#property NSMutableData *responseData;
#property NSURL *myURL;
#property (nonatomic, weak) id <ScanBookDelegate> delegate;
#end
Get rid of id <ScanBookDelegate> delegate; in your {} (at the top) and it should work. You don't need to specify that when using properties. If you really want to, then you can declare that ivar __weak so it matches your property (ivars are strong by default).

IOS5 -[__NSCFDictionary nombre]: unrecognized selector sent to instance 0x6da25a0

I get an error when trying to access an attribute of a class "event"
Json List all Ok When I trying to access the error jumps
Evento* bean = [ListaEventos objectAtIndex:indexPath.row];
DetalleViewController *detalle = [self.storyboard instantiateViewControllerWithIdentifier:#"Detalle"];
NSLog(#"detalle: %#",[bean nombre]);//bean Log OK!!, but bean.nombre Error!! why?
The class: evento.h
#interface Evento : NSObject
#property (strong, nonatomic) NSString *idevento;
#property (strong, nonatomic) NSString *nombre;
#property (strong, nonatomic) NSString *descripcion;
#property (strong, nonatomic) NSString *fecha;
#property (strong, nonatomic) NSString *telefono;
#property (strong, nonatomic) NSString *direccion;
#end
Evento.m
#implementation Evento
#synthesize idevento;
#synthesize nombre;
#synthesize descripcion;
#synthesize fecha;
#synthesize telefono;
#synthesize direccion;
#end
What you get out of [ListaEventos objectAtIndex:indexPath.row]; is of kind NSDictionary and not of kind Evento as supposed. Check your data!
The object you get with
[ListaEventos objectAtIndex:indexPath.row];
Is of type dictionary which doesn't have the method or the property nombre.
If you could add also add here the json we can help you to get the correct evento object.

Obj-c: Custom Object handling

I am creating my own custom object, and I am wondering if I need to retain my properties or use something else such as copy (which does what?)?
#interface Asset : NSObject {
NSString *name;
NSNumber *assetId;
NSNumber *linkId;
NSNumber *parentId;
}
#property (nonatomic, retain) NSString *name; // should I use retain here or something else?
#property (nonatomic, retain) NSNumber *assetId;
#property (nonatomic, retain) NSNumber *linkId;
#property (nonatomic, retain) NSNumber *parentId;
#end
Also, in my .m, do I also need synthesize as well as release?
The chapter on Declared Properties in The Objective-C Programming Language explains what copy does and about synthesizing accessors.
My personal preference:
#interface Asset : NSObject {
// no need to declare them here the #synthesize in the .m will sort all that out
}
// use copy for NSString as it is free for NSString instances and protects against NSMutableString instances being passed in...thanks to #bbum for this
#property (nonatomic, copy) NSString *name;
// no need for copy as NSNumber is immutable
#property (nonatomic,retain) NSNumber *assetId;
#property (nonatomic,retain) NSNumber linkId;
#property (nonatomic,retain) NSNumber parentId;
#end
For typical cases your .m will have lines like this:
#synthesize name;
...
That tells the compiler to automatically emit the getter/setter methods. You can also write/override these yourself.
So, when someone does a fooAsset.name = x, your object will retain its own reference to 'x'.
The other thing you need is a dealloc method to release the references to your members:
- (void)dealloc {
[name release];
....
[super dealloc];
}
Note that it'll still be appropriate if 'name' is never assigned; nil will silently eat the 'release' message.

Simple Question about Core Data

I using the project named coredatabooks from apple developer examples.
#import
#interface Book : NSManagedObject
{
}
#property (nonatomic, retain) NSNumber *active;
#property (nonatomic, retain) NSString *title;
#property (nonatomic, retain) NSString *author;
#property (nonatomic, retain) NSDate *copyright;
#end
I need to use a bool object, but I don't know how to implement it in my class.. I'm using right now NSNumber, using an integer (0, 1) but is not a Bool... maybe it will be more correct to use this ...
#property (nonatomic, retain) bool active;
but is not working.
You can still use an NSNumber, but pack it from a bool:
[NSNumber numberWithBool: myBool];
and unpack it to a bool:
[myNSNumber boolValue];

Error: request for member theSizes something not a structure or union

I'm getting this same error, but I've checked to make sure the properties were set correctly in the .h file.
Here's the code:
NSUInteger theSizesCount = [theWho.theSizes count];
The error is "error: request for member theSizes in something not a strucutre or union. This .m file is importing 6 .h files, and 4 of them have the same properties in theWho, but it's related to various Super Classes. This .m file is implementing only one of them, and theWho and theSize are sythesized.
Also, in this code, and theSizes variable is green, but theWho variable is not. Plus, the error is happening in multiple places for NSUIntegers, NSMutableArray etc.
Where am I going wrong? Some of the header file code is below.
// TheSize.h
#class TheWho;
#interface TheSize : NSManagedObject
{
}
#property (nonatomic, retain) NSString *name;
#property (nonatomic, retain) NSString *amount;
#property (nonatomic, retain) TheWho *theWho;
#property (nonatomic, retain) NSNumber *displayOrder;
#end
and..
//
// TheWho.h
//
#interface ImageToDataTransformer : NSValueTransformer {
}
#end
#interface TheWho : NSManagedObject {
}
#property (nonatomic, retain) NSString *instructions;
#property (nonatomic, retain) NSString *name;
#property (nonatomic, retain) NSSet *theSize;
#property (nonatomic, retain) UIImage *thumbnailImage;
#property (nonatomic, retain) NSManagedObject *image;
#property (nonatomic, retain) NSManagedObject *type;
#end
#interface TheWho (CoreDataGeneratedAccessors)
- (void)addTheSizesObject:(NSManagedObject *)value;
- (void)removeTheSizesObject:(NSManagedObject *)value;
- (void)addTheSizes:(NSSet *)value;
- (void)removeTheSizes:(NSSet *)value;
#end
I checked my declarations again, and I had to add an "s" to the NSSet *theSize entry. Those errors are gone. Thanks all for the help.
You still need to define the member variables. The #property directive declares the accessor methods, not the underlying members.
#interface TheWho : NSManagedObject {
NSString *instructions;
NSString *name;
NSSet *theSize;
UIImage *thumbnailImage;
NSManagedObject *image;
NSManagedObject *type;
}
You're trying to access theWho.theSizes but according to your header file, you should be trying theWho.theSize (without the trailing s).
Unless, there's a typo in how you've typed it here, and it wasn't copied directly.