ARC complaining about instance vairiables

2019-08-23 03:21发布

问题:

I am trying to convert non-ARC project to use ARC but for some reason its complaining about the use of all instance variables.

@property (nonatomic,retain)id myvariable;

results in

Error : "Use of undeclared variable _myvariable"

there are some places in my code where I don't want to modify retain count but do an assignment to the property. so I use an instance variable.

adding @syhtnesize myvariable =_myvariable resolves this problem but I am trying to figure out the right way to fix this.

Possible solutions:

1) Add synthesize

2) replace use of instance variable with self.myvariable and make property assigned.

EDIT: Extension of problem ARC errors

回答1:

It sounds like you've hit a backward compatibility feature.

Since Xcode 4.4 property declarations no longer require an @synthesize statement and without one the compiler auto-generates an _propertyName instance variable.

However with an @synthesize propertyName, as you would pre-Xcode 4.4, then the compiler will auto-generate an propertyName - note no underscore - instance variable.

The compiler messages warning you "Use of undeclared variable _myvariable" suggest you have switched the code to use underscores but still have some @synthesize myvariable statements.

Your use of @synthesize myvariable = _myvariable specifies the name to use for the instance variable directly, and so solves your problem, but removing the @synthesize completely is the usual approach.



回答2:

With all the arc stuff

@property (nonatomic, strong) Something *myVariable;

is accessible by both

self.myVariable;

and

_myVariable;

No need to use @synthesize



回答3:

It depends what you need. If you declare property:

@property (strong) NSString *myvariable;

And you want to change name of the private ivar to something different that _myvariable you have to add

@synthesize myvariable = _myVarNewName

but if you want to use exactly the same name with underscore on the front just remove @synthesize (works with iOS 6 and above) and the compiler do the rest so you can access the private variable like _myvariable or public like self.myvariable.