2012-02-06 91 views
20

這是一個兩部分的問題,希望我可以瞭解更多關於該主題。iOS財產聲明澄清

1)在我看來,你必須在objective c聲明屬性一個二班流行選項。一種是將屬性添加到標題的類體中,例如。

@interface MyClass : NSObject { 
    NSArray *myArray; 
} 

或者你可以在@interface後身體和@end聲明像這樣前加入。

@interface MyClass : NSObject { 
    // 
} 

@property (nonatomic, retain) NSArray *myArray; 

是什麼這兩個「風格」,當你選擇一個比其他的區別?

2)在@property之後,您會找到諸如(nonatomic, retain)之類的選項。什麼是和爲什麼/當你使用不同的選項?

回答

47

下面是Xcode中識別的唯一屬性修改器:

  • nonatomic(對物業不強制線程安全,主要用於使用時只有一個線程應在整個程序中使用)
  • atomic(強制執行的財產線程安全,主要用於當多個線程將在整個程序中使用)(默認)
  • retain/strong(自動保存/上設置的版本價值,確保值不會意外取消分配)(默認值,如果ARC和對象類型)
  • readonly(不能設置屬性)
  • readwrite(既可以set和get屬性)(默認)
  • assign/unsafe_unretained(無存儲器管理應以該屬性來完成,它是通過將值的人手動處理)(默認值如果不是ARC或對象類型)
  • copy(份數設置它之前的對象,在由於外部因素(字符串,數組等),值集不能改變的情況。
  • weak(自動歸零應的對象被解除分配的參考,並且不保留傳遞的值)
  • getter=method(將用於獲取該屬性的值的選擇器)
  • setter= method(設定中使用的選擇器用於設置此屬性的值)
+3

這個答案只有問題的第2部分。 Simon的答案討論第1部分。 – 2013-06-11 17:05:09

+0

@MarkAmery當然 - 我覺得第1部分是非常基本的,其他答案在我回答時已經涵蓋了它。無需在此添加重複信息。 # – 2013-06-11 17:21:38

+1

#2完全不正確。 'atomic'屬性*不*確保線程安全;而是確保原子性。如果線程A和線程B都在寫入,'atomic'確保結果將是一個整體值,這意味着任何一個或另一個。哪一個是未定義的。編寫線程安全的代碼並不像使用'atomic'屬性那麼簡單。請參閱線程編程指南的「同步」一節:http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/Multithreading/ThreadSafety/ThreadSafety.html#//apple_ref/doc/uid/10000057i -CH8-SW1 – 2013-07-20 10:46:41

0

第一個將是私人聲明,如果您沒有定義第二個,那麼其他類將無法訪問它。其次,在.m模塊中與@synthesize一起使用,編譯器爲您創建setter/getter。你仍然可以用這個定義你自己的getter或setter。在這種情況下,@property中定義的所有iVars都可以被其他類訪問。​​保留/釋放操作是自動完成的。 您應該閱讀Apple文檔以獲取更多詳細信息。 請檢查: What's the difference between the atomic and nonatomic attributes?

28

1)@property是定義getter-和setter-methods的一種特殊方法,或者我們稱之爲Objective-C中的訪問器。你的第一個片段只是聲明一個你必須自己聲明和寫入訪問器的數組。例如setMyArray:myArray
使用@property將聲明您的訪問器,相當於自己聲明setMyArray:myArray。自Objective-C 2.0開始,聲明訪問器是首選方法。請注意,您仍然必須自己聲明屬性(您的情況myArray)。

2)您首先需要了解@synthesize。記住@property聲明你的屬性的訪問器,@synthesize會執行它們。當你在@interface中使用@property時,你最可能在@implementation中寫一個@synthesize。使用@synthesize相當於執行setMyArray:myArray
屬性(nonatomic, retain)告訴編譯器等內存管理應該如何工作,以及如何實現這些方法。請注意,您從未真正看到這些訪問器,但請放心,它們已存在並準備好供您使用。

要閱讀有關該主題的更多信息,我建議閱讀以下Tutorial的第9部分屬性或購買涵蓋Objective-C簡介的Book

你也應該熟悉至少以下屬性:

  • 訪問
    • 選擇readwrite(默認)或readonly。如果設置了readonly,則只有getter方法可用。
  • 設置器內存管理
    • assign(默認),簡單地分配新值。你最可能只用原始數據類型。
    • retain,釋放舊值並保留新值。如果使用垃圾回收器,則retain相當於assign。爲什麼?舊值的手動發佈將由垃圾收集器完成。
    • copy將複製新值並釋放舊值。這通常用於字符串。
  • 穿線
    • atomic(默認)將確保setter方法是原子的。這意味着只有一個線程可以立即訪問setter。
    • nonatomic,當你不使用線程時使用它。

This post給你一個很好的介紹內存管理和assignretaincopy

+0

@Jackson我是否可以請你接受我的回答?如果你不能接受,請讓我知道我能做些什麼來使我的回答更好。我非常感謝我的聲譽,謝謝! – Simon 2012-02-08 08:47:59

+2

嗨,我誠懇地認爲'理查德J.羅斯三世'對於像我這樣的非讀者有一個更簡潔的答案。然而,我確實把你當作+1,因爲你顯然會在你的答案中付出很多努力。另外,我看到*商業概念*在問爲什麼我沒有接受你的答案,但我相信這是一個「推遲」*要求某人接受你的答案。我相信每個人都有不同的*關於這個話題。無論如何,這是我的雙重意義。 – Jacksonkr 2012-02-18 22:57:24

2

屬性基本上是訪問器方法。他們定義變量的範圍。 上面給出的第一種情況是,變量不能在其他類中訪問,而通過在第二種情況下聲明屬性,變量也可以在其他類中訪問。 另外,它們對內存管理很有用。

+0

一個實例變量可以通過聲明它們爲'@ public'而被其他類訪問。 – newacct 2014-04-05 10:55:06

0

屬性基本上是訪問器方法。他們定義變量的範圍。默認訪問說明的變量是保護和屬性設置其說明從保護公開