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

后端 未结 3 1823
野的像风
野的像风 2020-12-23 18:21

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

NSString no \'assign\', \'retain\', or \'copy\' attribute is specifie
相关标签:
3条回答
  • 2020-12-23 18:42

    Cocoa uses reference counting to manage memory. Objects with a reference count of 0 are deleted.

    • assign - does nothing to reference count simply points your variable to the data
    • retain - points your variable to data and adds 1 to reference count, data is guaranteed to be there while your variable is still alive
    • copy - makes a copy of data, points your variable at it and makes the retain count 1

    More detail here, at Apple's own documentation.

    0 讨论(0)
  • 2020-12-23 18:53

    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.

    0 讨论(0)
  • 2020-12-23 19:00

    assign - the ivar is set by doing a simple assignment. Implementation:

    - (void) setFoo:(NSString *)newFoo {
      foo = newFoo;
    }
    

    retain - the ivar is sent the retain message before doing the assignment. Implementation:

    - (void) setFoo:(NSString *)newFoo {
      if (foo != newFoo) {
        [foo release];
        foo = [newFoo retain];
      }
    }
    

    copy - the ivar is sent the copy message before doing the assignment. Implementation:

    - (void) setFoo:(NSString *)newFoo {
      if (foo != newFoo) {
        [foo release];
        foo = [newFoo copy];
      }
    }
    
    0 讨论(0)
提交回复
热议问题