[英]NSString no 'assign', 'retain', or 'copy' attribute is specified
我在類中聲明了NSString屬性,而Objective-C則在抱怨:
NSString未指定“分配”,“保留”或“復制”屬性
然后,它隨便讓我知道“改為使用分配”。
有人可以按照正常的C內存管理功能向我解釋Assign , Retain和Copy之間的區別嗎?
我認為它引起您注意使用assign
的事實,而不是retain
或copy
。 由於NSString
是對象,因此在引用計數的環境(即,沒有垃圾回收)中,這有可能是“危險的”(除非是有意設計的)。
但是, assign
, retain
和copy
之間的區別如下:
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的對象將被刪除。
有關更多詳細信息 ,請參閱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.