2011-04-01 36 views
-1

我有下面的類困惑何時使用自我。在目標C

@interface DetailMessageViewController : UIViewController<UITextFieldDelegate,MFMessageComposeViewControllerDelegate,UIScrollViewDelegate> { 
NSString *messageid; 
NSString *messagesenttime; 
NSString *sendermobilenumber; 

NewMessageAnimation *animation; 
NSString *addseconds; 
IBOutlet UITextField *replyfield; 
IBOutlet UIButton *replybutton; 
NSString *tempstring; 
UIAlertView *messagesent; 
NSTimer *checkifanimationplayed; 

} 

@property(nonatomic,retain) NSString *messageid; 
@property(nonatomic,retain) NSString *messagesenttime; 

-(IBAction)replytomessage:(id)sender; 
-(NSString *)decryptstring:(NSString *)encryptedstring; 
+ (NSData *)decodeBase64WithString:(NSString *)strBase64; 
-(void) animateTextField: (UITextField*) textField up: (BOOL) up; 
-(IBAction)goawaykeyboard; 
-(NSString *)encryptstring:(NSString *)clearstring; 
+(NSString *)returndestroytime; 
@end 

我是什麼時候在我的實現使用的自我。(實例變量)很困惑。到目前爲止,我從未在自己的實現中使用過self.ivar。我沒有在dealloc方法中釋放任何實例變量,並且我沒有在我的viewdidunload方法中將我的ivars設置爲nil。我的程序仍然正常工作。我知道的一件事是 - 當我試圖從課堂外訪問或分配ivars時,我使用該屬性。

當我編碼什麼是做 - 我做「構建和分析」。它不時給我幾個錯誤。我確信我將釋放所有分配的ivars,只要有可能。最後,我確定我沒有任何藍色的錯誤從我的構建和分析。應該沒問題,或者我應該強制釋放dealloc方法中的所有ivars,並在我的viewdidunload方法中將ivars設置爲零。

。有人能指出我正確的方向進行內存管理。

+0

請編輯您的帖子上的代碼,使其更具可讀性。 – Joze 2011-04-01 14:40:43

+0

問了22個問題之後,我們可以期待你正確地設置你的問題的格式。 – DarkDust 2011-04-01 14:41:27

+0

@DarkDust可能是我沒有意識到的東西,我複製代碼形式的Xcode和我點擊大括號按鈕,並通過它在那裏,並出於某種原因50%的時間不正確粘貼。我嘗試了幾次,但沒有得到它的權利。 – Rajashekar 2011-04-03 09:21:48

回答

0

基本上,它很簡單:你使用自我。如果你想訪問屬性並且離開自己,如果你想訪問成員變量。也就是說,通過訪問其getter/setter來訪問該屬性。

因此,要通過屬性訪問您的messageid,您需要調用self.messageid,通過成員變量訪問它,您只需調用messageid。現在

..說,如果你有自己的構造函數傳遞一個信息id到類,你最有可能做這樣的事情

-(void) initWithMessageId:(NSString*) aMessageId { 
    if (super initWithNibName:.....) { 
    self.messageid = aMessageId; 
    ... 
    } 
    return self; 
} 

如果你只會做

if (super initWithNibName:.....) { 
    messageid = aMessageId; 
    ... 
會發生什麼

而不是自我?您將訪問該成員,因此您必須保留自己以容納該屬性(「messageid = [aMessageId retain];」)。

0

總之,使用「構建和分析」作爲您唯一的防泄漏方法是行不通的。這裏是最基本的總結:

使用關鍵字'自我'會調用一個自動生成的getter和setter。除了幫助進行內存管理之外,屬性還可以減少代碼重複(即,如果您編寫自定義setter或getter來執行「額外」工作),並且可以使重構代碼更加輕鬆。

無論您決定使用屬性,您都必須在dealloc中釋放所有保留的數據(否則您將泄漏)。屬性通過使'保留'記憶易於識別來幫助(提示:釋放並取消所有'保留'屬性)。請參閱here

+0

蘋果文檔是獲得內存管理權利的正確場所,但如果您乍看起來太深,您可以隨時查閱斯坦福大學內存管理講座 - > http://www.stanford.edu中的基礎知識/class/cs193p/cgi-bin/drupal/system/files/lectures/Lecture%204.pdf – 2011-04-01 15:15:05