簡體   English   中英

保留Objective-c(再次但更精確)

[英]retain with objective-c (again but with more precision)

我再次發布這個問題,但這次更准確,

首先,我有一個返回字符串的函數,有關內存管理的錯誤或此功能還可以嗎?

-(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;
}

當我稱此功能為

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

再次......

motAvecCle:方法motAvecCle:返回您不擁有的對象。 因此,在某些時候它會消失。 是否關心取決於myString的定義位置。 如果它在相同的范圍內:

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

你不想保留它(除了在一種情況下),因為當foo退出時引用將消失,這意味着如果你保留它,你需要先再次釋放它。

保留的一種情況是,如果您修改了對象,則在這種情況下是從self那里獲得的字符串。 可能會導致字符串消失(盡管在您的特定示例中可能不會)。

如果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
}

由於每次想要分配ivar時都必須這樣做,所以創建一個訪問器是正常的,例如

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

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM