[英]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.