2010-11-17 62 views
0

我再次發佈這個問題,但更精確此時,與Objective-C的(再次,但更精確)保留

第一,我有這個功能誰返回一個字符串,沒有內存管理或一些錯誤這個功能可以嗎?

-(NSString *) motAvecCle:(NSString *) cle 
{ 
    NSString *motRetour; 

    motRetour = @""; 

    cle = [FonctionUtile concatener:[[tableauConfig singletonTableauConfig] langueAffichage] chaine2:@"_" chaine3:[FonctionUtile trim:[cle uppercaseString]] chaine4:@""]; 

    motRetour = [FonctionUtile trim:[dictionnaireLangue objectForKey:cle]]; 

    if (motRetour == nil) { 
     motRetour = @"Erreur"; 
    } 

    return motRetour; 
} 

,當我把這個fonction,再次

NSString *myString = @""; 
myString = [self motAvecCle:@"fr"]; // I must do this? 
myString = [[self motAvecCle:@"en"]retain]; //or do this? 

THX ...

回答

2

motAvecCle:返回你沒有自己的對象的方法。因此,它在某個時候會消失。無論您是否在意取決於哪裏定義了myString。如果是在同一個範圍:

-(void) foo 
{ 
    NSString *myString = [self motAvecCle:@"fr"]; 
    // do some stuff 
} 

你不想保留它(除了在一種情況下),因爲參考消失時富退出,這意味着,如果你保留了它,你就需要重新釋放第一。

保留的一種情況是,如果您在本例中修改了從自己獲得字符串的對象。 可能導致字符串消失(儘管可能不在您的具體示例中)。

如果myString是對象的實例變量,您確實希望保留它,否則它會在下次自動釋放池耗盡時消失(可能)。然而,分配實例變量之前,你必須確保以釋放實例變量的舊值,除非它實際上是要分配,即你需要做這樣的事情了相同的字符串:

-(void) foo 
{ 
    NSString *tmp = [[self motAvecCle:@"fr"] retain]; // it's a string, technically you should copy, not retain 
    [myString release]; 
    myString = tmp; 
    // do some stuff 
} 

既然你」每次你想分配伊娃時,都必須這樣做,創建一個訪問器是正常的

-(void) setMyString: (NSString*) newValue 
{ 
    NSString* tmp = [newValue copy]; 
    [myString release]; 
    myString = tmp; 
} 

-(void) foo 
{ 
    [self setMyString: [self motAvecCle:@"fr"]]; 
    // do some stuff 
} 

如果使用屬性,則可以使用@synthesize來創建訪問器。

+0

你是對的。我刪除了我的答案。 – 2010-11-17 17:21:34