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