物件或多或少都會有可以公開存取的屬性,在Objective-C裡叫property。既然能夠公開存取,依據物件封裝的規則,你必需要提供相對應的setter/acceror和gatter/mutator。在Java裡得手動或用IDE去幫你產生setter和gatter,在Objective-C裡有個簡單的方式,那就是用@property這個directive來宣告,Objective-C就會幫你把setter和gatter準備好。
於是我看了書,寫了一個簡單的類別(MyName),在裡面宣告了兩個屬性firstName和lastName,程式碼如下:
- #import <Foundation/Foundation.h>
- @interface MyName : NSObject {
- NSString *firstName;
- NSString *lastName;
- }
- @property NSString *firstName;
- @property NSString *lastName;
- @end
可是在編譯時出現了這樣的warning訊息:
簡單來講就是說,我所宣告的屬性是weak reference,寫第一支程式就看到書上沒提到的warning訊息,雖然程式能正常運作,但這個問題還是得搞懂才行。所以又查了網路,看看到底為什麼我照書打,但還是有這個訊息。
iPhone為了節省電力的原故,所以並不像Java會自動的做garbage collection。所以任何你在程式裡所宣告的物件,即始是個字串(NSString),都得自行release它所佔用的記憶體。這一點很重要,每個iPhone App的程式設計師要遵守這條規定!
如果只是個內部的local物件,create和release的時間點很明確。不過對於可讓別人存取的物件屬性來說,你該怎麼release它?這就是出現這個warning訊息的原因。所以在使用@property這個directive時,也一併得告訴它,你這個屬性的reference type是什麼。我還沒把書看完,目前在網路上到的type有:
1.
assign
readonly
readwrite
2. retain
3. copy
4. nonatomic
照字面上來看,還蠻容易懂的,除了nonatomic (也有atomic)這個關鍵字。而1和2,3,4也可以組合使用,例如
- @property(nonatomic readonly copy)
我才看兩天,別問我細節,改天等我完全搞懂了,再發另一篇文來詳細解釋,加上圖示,大家可能會更容易了解。
所以把上面的程式碼修改一下, 就不會出現那個warning訊息了:
- #import <Foundation/Foundation.h>
- @interface MyName : NSObject {
- NSString *firstName;
- NSString *lastName;
- }
- @property(assign) NSString *firstName;
- @property(assign) NSString *lastName;
- @end
參考資料:
推文( 0 )

