Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

NSString no 'assign', 'retain', or 'copy' attribute is specified

I'm declaring an NSString property in a class and objective-c is complaining that:

NSString no 'assign', 'retain', or 'copy' attribute is specified

It then casually lets me know that "assign is used instead".

Can someone explain to me the difference between assign, retain and copy in terms of normal C memory management functions?

like image 573
bobobobo Avatar asked Nov 02 '09 18:11

bobobobo


People also ask

What is retain and assign in IOS?

My understanding is that "assign" should be used for non-pointer attributes. "retain" is needed when the attribute is a pointer to an object. The setter generated by @synthesize will retain (aka add a retain count) the object. You will need to release the object when you are finished with it.

What is difference between assign and retain?

Assign creates a reference from one object to another without increasing the source's retain count. Retain creates a reference from one object to another and increases the retain count of the source object.

What is @property in Objective C?

The goal of the @property directive is to configure how an object can be exposed. If you intend to use a variable inside the class and do not need to expose it to outside classes, then you do not need to define a property for it. Properties are basically the accessor methods.


1 Answers

I think it is drawing your attention to the fact that a assign is being used, as opposed to retain or copy. Since an NSString is an object, in a reference-counted environment (ie without Garbage Collection) this can be potentially "dangerous" (unless it is intentional by design).

However, the difference between assign, retain and copy are as follows:

  • assign: In your setter method for the property, there is a simple assignment of your instance variable to the new value, eg:

    - (void)setString:(NSString*)newString
    {
        string = newString;
    }
    

    This can cause problems since Objective-C objects use reference counting, and therefore by not retaining the object, there is a chance that the string could be deallocated whilst you are still using it.

  • retain: this retains the new value in your setter method. For example:

    - (void)setString:(NSString*)newString
    {
        [newString retain];
        [string release];
        string = newString;
    }
    

    This is safer, since you explicitly state that you want to maintain a reference of the object, and you must release it before it will be deallocated.

  • copy: this makes a copy of the string in your setter method:

    - (void)setString:(NSString*)newString
    {
        if(string!=newString)
        {
            [string release];
            string = [newString copy];
        }
    }
    

    This is often used with strings, since making a copy of the original object ensures that it is not changed whilst you are using it.

like image 185
Alex Rozanski Avatar answered Sep 19 '22 23:09

Alex Rozanski