2011-04-24 27 views
0

我現在這是一個愚蠢的問題,但我仍然對這種情況有一些瞭解甚少。這是關於內存管理和引用計數,我有一些疑問,如果我使用副本,分配和可變副本,有多少引用計數會增加。這是我的代碼有:多少引用計數增加

這是myController.h:

#import <UIKit/UIKit.h> 


@interface myController : UIViewController { 
NSMutableString *mutableStringCode; 
} 
@property (nonatomic, copy) NSMutableString *mutableStringCode; 
@end 

,這是myController.m

#import "myController.h" 


@implementation myController 

-(void)viewDidLoad{ 
    mutableStringCode = [[NSMutableStringCode alloc]init]; 
    [self refresh]; 

} 


-(void)refresh{ 
    NSMutableString *myFileContents = [NSMutableString stringWithContentsOfFile:localPath encoding:NSUTF8StringEncoding error:&error]; 

    mutableStringCode = [myFileContents mutableCopy]; 

    //another code 

    myFileContents = nil; 
} 


-(void)dealloc{ 
    [mutableStringCode release]; 

    [super dealloc]; 

} 

@end 
在這段代碼

,我有些疑惑: 1.如何那個mutableStringCode中引用計數增加了很多? 2.是否使用copy而不是retain設置mutableStringCode屬性的真實方法? 3.我是否需要在設置屬性後複製mutableStringCode

可以有些身體描述給我? 謝謝

回答

0
  • 如果你只是創建一個myController類的實例,然後釋放它,一切都會好的。 mutableStringCode將在viewDidLoad中創建(如果它將被調用)並在dealloc中釋放。這是因爲alloc保留了對象。
  • 每當您致電刷新時,都會發生以下這些事情:
    • 您創建autoreleased可變字符串myFileContents。
    • 您將其複製到mutableStringCode,保留它(複製保留對象)。

我在這裏看到的主要問題是,刷新過程中你是不是釋放已創建mutableStringCode。所以它保持在內存中(這是通常的內存泄漏)。

您可以嘗試使用Analyze或Instruments的泄漏工具捕獲這些類型的內存泄漏。

+0

謝謝你的回答,我盡力去做,但我想問一下,我是否必須在該viewDidload中釋放mutableStringCode,還有在dealloc方法中? – 2011-04-24 11:44:21

+0

將值分配給mutableStringCode之前,請確保完全釋放當前值。建議的操作是在將myFileContents分配給它之前,將自動釋放消息發送到mutableStringCode。但是,如果您不明白爲什麼,請仔細閱讀並仔細閱讀有關Objective-C內存管理的內容(在StackOverflow或其他地方)。這是一件非常重要的事情。 – bealex 2011-04-24 16:45:52

相關問題