error: writable atomic property cannot pair a synthesized setter/getter with a user defined setter/getter

35,307

Solution 1

I had the same problem and after doing a bit of research, here is my conclusion about this issue:

The compiler warns you about a @property that you declared as atomic (i.e. by omitting the nonatomic keyword), yet you provide an incomplete implementation of how to synchronize access to that property.

To make that warning disappear:

If you declare a @property to be atomic then do one of the following:

  • use @dynamic or;
  • use @synthesize and keep the synthesized setter and getter or;
  • provide a manual implementation of both the setter and the getter (without using one of the above directives).

If you declare the @property with (nonatomic) then you can mix manual and synthesized implementations of getters and setters.

Update: A Note on Property Auto-Synthesis

As of LLVM 4.0, CLang provides auto-synthesis for declared properties that are not @dynamic. By default, even if you leave out the @synthesize, the compiler will provide getter and setter methods for you. However, the rule for atomic properties is still the same: Either let the compiler provide both the getter and the setter, OR implement them both yourself!

Solution 2

You need to implement the getter also. Example:

// Interface:

@property (retain) NSObject * someProperty;

// Implementation:

- (void)setSomeProperty:(NSObject *)newValue
{
    @synchronized (self)
    {
        // ...
    }
}

- (NSObject *)someProperty
{
    NSObject *ret = nil;

    @synchronized (self)
    {
        ret = [[someProperty retain] autorelease];
    }

    return ret;
}

Solution 3

This question, among the other top hits you get from searching for "objective C custom property", are not updated with information about "setter =" or "getter =".

So, to supply more information on this question:

You can supply the @property call with your own method by writing

    @property(setter = MySetterMethod:, getter = MyGetterMethod)

Notice the colon for the supplied setter method.

Reference Apple documentation

EDIT: I'm not quite sure how the new changes to Objective-C's properties (they are much more intelligent now) change the answers to this question. Perhaps it should all be marked as out of date.

Share:
35,307
Mathias
Author by

Mathias

I code, therefore I am.

Updated on August 03, 2020

Comments

  • Mathias
    Mathias almost 4 years

    I recently tried to compile an older Xcode project (which used to compile just fine), and now I'm seeing a lot of errors of this form:

    error: writable atomic property 'someProperty' cannot pair a synthesized setter/getter with a user defined setter/getter

    The code pattern which causes these errors always looks like this:

    // Interface:
    
    @property (retain) NSObject * someProperty;
    
    // Implementation:
    
    @synthesize someProperty; // to provide the getter
    - (void)setSomeProperty:(NSObject *)newValue
    {
        //..
    }
    

    I can see why the error is being generated. I tell the compiler to synthesize my property accessors (both getter and setter), and then immediately afterward I override the setter manually. That code has always smelled a little off.

    So, what is the proper way to do this? If I use @dynamic instead of @synthesize, I will have to write the getter as well. Is that the only way?

  • Nianliang
    Nianliang almost 12 years
    Thanks! "declare the @property with (nonatomic)"
  • David van Dugteren
    David van Dugteren almost 12 years
    I found that setting the setter method didn't actually remove the warning. e.g. -> "@property (assign, setter = setDelegate:) id delegate;" In this instance all I can do is add my own getter or add the nonatomic property, which I'm not sure if I should, given that I'm setting the delegate myself 'atomically', it doesn't matter having the nonatomic property, or so I understand.
  • Matias Forbord
    Matias Forbord over 11 years
    Interesting, David. What "version" of Objective-C is this in (I suppose saying the XCode-version would be more helpful)? I'm not sure what the recent changes to Objective-C, specifically with iOS 6 affect this.