2011-04-22 50 views
0

我有這段代碼。保留在Objective-C中如何工作?

-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{ 
    if ([elementName isEqualToString:@"stat"]) { 
     currentKey = [attributeDict objectForKey:@"name"]; 
     currentValue = [[[NSMutableString alloc] init] autorelease]; 
    } 
} 

-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{ 
    [currentValue appendFormat:string]; 
} 

-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{ 
    if ([currentKey isEqualToString:@"url"]) 
     self.urlToServerLog = currentValue; 
} 

而頭文件

@interface HDEAppDelegate : NSObject <NSApplicationDelegate, NSXMLParserDelegate> { 
@private 
    NSWindow *window; 
    NSString* scratchFolder; 
    NSMutableString *urlToServerLog; 
    NSString *currentKey; 
    NSMutableString *currentValue; 
} 

@property (assign) IBOutlet NSWindow *window; 
@property (assign) IBOutlet NSTextField *output; 
@property (assign) IBOutlet NSTextField *matchID; 
@property (retain) NSString *scratchFolder; 
@property (retain) NSMutableString *urlToServerLog; 

-(IBAction) ParserButton:(id)sender; 
-(NSFileWrapper*)unzip:(NSData*)zipData; 

@end 

這裏的問題是在urlToServerLog/CurrentValue的對象被刪除。

我發現一個解決方案是複製對象,但我原來的解決方案仍然存在。 爲什麼在這種情況下不保留工作?

BTW:scratchFolder也使用了自動釋放的對象,它的工作完美(使用完全相同的方式,從NSString的(自動釋放回),並分配給scratchFolder

+0

很混亂!!!!! – 2011-04-22 21:33:55

回答

1

-parser:didStartElement:namespaceURI:qualifiedName:attributes:後,您分配一個新的字符串,並自動釋放它:

currentValue = [[[NSMutableString alloc] init] autorelease]; 

這意味着該字符串將在相應的自動釋放池被耗盡時釋放。通常,如果在方法執行完成後需要保持對象的活動狀態,則需要擁有它。在你的情況下,不要在此時自動釋放它(並且記住在你不再需要時釋放它),或者使currentValueretain屬性並使用self.currentValue = …代替。

還有一點要考慮:你可能想使urlToServerLog一個copy財產,而不是retain之一,因爲currentValue,是一個可變的字符串,將在執行XML解析器改變。如果您使用的是retain,則urlToServerLog屬性也會更改,因爲它指向相同的可變字符串。通過將屬性更改爲copy,您可以有效複製currentValue - 對currentValue的任何進一步更改都不會影響該屬性。

+0

我不明白,我剛開始並不好。 currentValue是一個伊娃,它根本不是一個財產。 當我們將currentValue賦值給self.urlToServerLog時,請不要將此調用保留在currentValue上,以便計數加1。 不是嗎? – 2011-04-22 21:20:13

+0

@Jonathan我已經編輯了我的答案,並且包含了一段話。你可能想'copy'而不是'retain'。 – 2011-04-22 21:25:10

+0

@Bavarious,有更多的問題。順便幫忙。謝謝。 currentValue不會更改,因爲它正在被分配,如上所示。所以它的位置會改變,舊的會保持不變。 二是我不能使用複製,因爲它是一個可變的對象。除了使用mutableCopy(首選屬性本身)之外,再次優先考慮工作。第三是,是否使用(如果它是一個屬性)「test = [alloc]; test = nil; test = [alloc]」和「test = [alloc]; test = [alloc]」是否一樣?第二個例子是否會調用「release」? 謝謝。 – 2011-04-22 21:32:02

1

currentValue被釋放時didStartElement:結束。 ??我認爲currentValue是一個類變量,你看到了什麼urlToServerLog價值分配currentValue

+0

當didStartElement結束時,currentValue被釋放。 但不會分配currentValue urlToServerLog添加保留計數? – 2011-04-22 21:21:36

+0

currentValue已經消失了。沒有保留計數是因爲沒有對象。 – 2011-04-22 21:28:14

+0

但是,如果我做「self.urlToServerLog = [currentValue mutableCopy];」。它仍然有效。所以這個對象不應該被刪除嗎? – 2011-04-22 21:33:24

相關問題