如何从函数中处理返回的对象以避免内存泄漏?

时间:2011-05-17 09:10:40

标签: iphone objective-c memory-management

假设我有一个功能

- (NSString *)fullNameCopy {
    return [[NSString alloc] initWithFormat:@"%@ %@", self.firstName, self.LastName];
}

有人可以告诉我如何调用此函数,如何将其值分配给新对象,以及如何释放它,避免内存泄漏和访问不良。

会不会像

NSSting *abc = [object fullNameCopy];

//使用它并发布

[abc release];

或者我也应该分配abc字符串?

更新:

这里的重点是,我可以从函数中返回非自动释放对象,然后在调用函数中释放它们。根据Obj-C函数命名约定,包含alloc或copy的函数名称应返回对象,假设调用函数具有所有权。

与上面的情况一样,我的函数“fullNameCopy”返回一个非自动释放的abject,我想在调用函数中释放它们。

4 个答案:

答案 0 :(得分:2)

你是对的。由于方法名称包含单词“copy”,因此Cocoa约定规定该方法返回调用者拥有的对象。由于调用者拥有该对象,因此它负责释放它。例如:

- (void)someMethod {
    NSString *abc = [object fullNameCopy];

    // do something with abc

    [abc release];
}

或者,您可以使用-autorelease代替-release

- (void)someMethod {
    NSString *abc = [[object fullNameCopy] autorelease];

    // do something with abc
}

答案 1 :(得分:0)

参考this帖子

更新:

- (NSString *)fullNameCopy {
    NSString *returnString  = [NSString stringWithFormat:@"%@ %@", self.firstName, self.LastName]; // Autorelease object.
    return returnString;
}

-(void) someFunction {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    NSString *fullName = [self fullNameCopy];

    [pool release]
}

答案 2 :(得分:0)

喜欢这个:

- (NSString *)fullName {

    NSString * retVal = [[NSString alloc] initWithFormat:@"%@ %@", self.firstName, self.LastName];

    return [retVal autoRelease];
}

然后

NSSting * abc = [object fullName];

答案 3 :(得分:-1)

return [[[NSString alloc] initWithFormat:@“%@%@”,self.firstName,self.LastName] autorelease];