簡體   English   中英

NSString未指定“分配”,“保留”或“復制”屬性

[英]NSString no 'assign', 'retain', or 'copy' attribute is specified

我在類中聲明了NSString屬性,而Objective-C則在抱怨:

NSString未指定“分配”,“保留”或“復制”屬性

然后,它隨便讓我知道“改為使用分配”。

有人可以按照正常的C內存管理功能向我解釋AssignRetainCopy之間的區別嗎?

我認為它引起您注意使用assign的事實,而不是retaincopy 由於NSString是對象,因此在引用計數的環境(即,沒有垃圾回收)中,這有可能是“危險的”(除非是有意設計的)。

但是, assignretaincopy之間的區別如下:

  • Assign :在屬性的設置方法中,可以簡單地將實例變量分配給新值,例如:

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

    由於Objective-C對象使用引用計數,因此可能會引起問題,因此,通過不保留對象,有可能在您仍在使用字符串時將其釋放。

  • 保留 :這將保留您的setter方法中的新值。 例如:

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

    這是比較安全的,因為您明確聲明要維護該對象的引用,並且必須在釋放該對象之前釋放它。

  • copy :這將在您的setter方法中復制字符串:

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

    這通常與字符串一起使用,因為制作原始對象的副本可確保在使用它時不會對其進行更改。

可可使用引用計數來管理內存。 引用計數為0的對象將被刪除。

  • 分配-不執行引用計數只是將變量指向數據
  • 保留-將變量指向數據並將引用計數加1,保證變量仍在運行時數據就存在
  • 復制-復制數據,將您的變量指向它,並使保留計數為1

有關更多詳細信息 ,請參閱Apple自己的文檔。

assign -通過執行簡單的分配來設置ivar。 實現方式:

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

retain -進行分配之前,向ivar發送保留消息。 實現方式:

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

copy -執行分配之前,向ivar發送復制消息。 實現方式:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM