This page looks plain and unstyled because you're using a non-standard compliant browser. To see it in its best form, please visit upgrade to a browser that supports web standards. It's free and painless.

iT老爸碎碎唸 會員登入 會員註冊

« 上一篇 | 下一篇 »

物件或多或少都會有可以公開存取的屬性,在Objective-C裡叫property。既然能夠公開存取,依據物件封裝的規則,你必需要提供相對應的setter/acceror和gatter/mutator。在Java裡得手動或用IDE去幫你產生setter和gatter,在Objective-C裡有個簡單的方式,那就是用@property這個directive來宣告,Objective-C就會幫你把setter和gatter準備好。

於是我看了書,寫了一個簡單的類別(MyName),在裡面宣告了兩個屬性firstName和lastName,程式碼如下:
  1. #import <Foundation/Foundation.h>
  2. @interface MyName : NSObject {
  3.     NSString *firstName;
  4.     NSString *lastName;
  5. }
  6. @property NSString *firstName;
  7. @property NSString *lastName;
  8. @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也可以組合使用,例如
  1. @property(nonatomic readonly copy) 
我才看兩天,別問我細節,改天等我完全搞懂了,再發另一篇文來詳細解釋,加上圖示,大家可能會更容易了解。

所以把上面的程式碼修改一下, 就不會出現那個warning訊息了:
  1. #import <Foundation/Foundation.h>
  2. @interface MyName : NSObject {
  3.     NSString *firstName;
  4.     NSString *lastName;
  5. }
  6. @property(assign) NSString *firstName;
  7. @property(assign) NSString *lastName;
  8. @end
參考資料:

發表回應
  1. Re: 屬性的宣告 [回覆]

    我也是最近才開始看 iphone 的程式!
    更慘的是我沒有什麼程式底子~~︿︿|||
    希望能從你網站上學到很多。

    你若有用 iphone 或 ipad,
    在 itunes u 中 stanford 大學中,
    有開了門 object-c 的課,由 apple 工程師講課!
    free 的。
    如有興趣我再介紹!
    互相加油!

    神~ 回應於 22 四月, 2010 19:15