问题描述:

In the @interface, I have this declaration:

@interface myClass {

NSDictionary * myData;

}

@property (nonatomic, assign) NSDictionary * data;

+ (id) initWithData:(NSDictionary *)data;

@end

In the @implementation, I have this code:

@implementation

@synthesize data;

+ (id) initWithData:(NSDictionary *)freshData {

self = [super init];

if (self) {

self->data = freshData;

}

return self;

}

@end

But I got error Incomplete definition of type 'struct objc_class on self->data.

If I change it into self.data, I got error Member reference type 'struct objc_class *' is a pointer; did you mean to use '->'?

If I remove the self, I got error `Instance variable 'data' accessed in class method.'

But if I change the method type from + (class method) to - (instance method), I cannot access the init.

And I cannot fix this error by change the assignment from data to myData either.

How should I make a constructor?

The link that I have learned from (but not helping) are:

  • Using 'self' in an @implementation
  • http://rypress.com/tutorials/objective-c/classes

网友答案:

You can do it like this also

+ (id) initWithData:(NSDictionary *)freshData {
    return [[self alloc]initWithData:freshData];
}
- (instancetype) initWithData:(NSDictionary *)freshData {

    NSParameterAssert(freshData != nil);

    self = [super init];

    if (self) {
        self.data = freshData;
    }

    return self;
}
网友答案:

In general, I would not expect an init* method to be a class method. Generally you have a class method with a name like default*, shared*, or *withDictionary:. So for a class named myClass, I'd expect to see this:

+ (myClass*)myClassWithDictionary:(NSDictionary*)dict
{
    return [[myClass alloc] initWithDictionary:dict];
}

This can be important when the static analyzer analyses your code, for example. Naming is significant in Objective-C and hints the compiler (and analyzer) as to what the code's intent is.

网友答案:

Do not using public init method (+)

+ (id) initWithData:(NSDictionary *)data;

Change to

- (instancetype) initWithData:(NSDictionary *)data;

And I highly recommend you to use instancetype instead of id (reference )

相关阅读:
Top