为NSString分配内存?

fuz*_*oat 2 memory cocoa objective-c

我是Objective-C的新手,我有点好奇我应该如何管理下面显示的本地NSString变量的内存以及类对象中的相关实例变量.我的代码工作正常,但只是对最佳实践感到好奇.

编辑包含完整的代码,没有什么特别的,就像我说我只是好奇,如果在这个上下文中我应该在NSString对象上进行alloc/release.

// MAIN ------------------------------------------------------------------- **
#import <Foundation/Foundation.h>
#import "PlanetClass.h";

int main (int argc, const char * argv[]) {

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    NSString *planet_01_Geek;
    NSString *planet_02_Geek;

    // Create planets
    PlanetClass *newPlanet_01 = [[PlanetClass alloc] init];
    [newPlanet_01 setGeekName:@"StarWars"];
    PlanetClass *newPlanet_02 = [[PlanetClass alloc] init];
    [newPlanet_02 setGeekName:@"Dune"];

    // Query a planet
    planet_01_Geek = [newPlanet_01 geekName];
    planet_02_Geek = [newPlanet_02 geekName];

    // Print details
    NSLog(@"Planet Geek    = %@", planet_01_Geek);
    NSLog(@"Planet Geek    = %@", planet_02_Geek);

    // Clean up
    [newPlanet_01 release];
    [newPlanet_02 release];
    [pool drain];
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

..

// CLASS HEADER ----------------------------------------------------------- **
#import <Foundation/Foundation.h>

@interface PlanetClass : NSObject {
NSString *geekName;
}

- (NSString*) geekName;
- (void) setGeekName:(NSString*)gName;
@end
// ------------------------------------------------------------------------ **
Run Code Online (Sandbox Code Playgroud)

..

// CLASS BODY ------------------------------------------------------------- **
#import "PlanetClass.h"

@implementation PlanetClass

- (NSString*)geekName {
    return geekName;
}
- (void)setGeekName:(NSString*)gName {
    geekName = gName;
}
@end
// ------------------------------------------------------------------------ **
Run Code Online (Sandbox Code Playgroud)

Pet*_*wis 8

阅读内存管理规则.9个简单的段落,解释了你需要知道的一切.

因为geekName不以"alloc"或"new"开头或包含"copy",所以它应该返回一个你不"拥有"的字符串.因此,您不需要(实际上也不必)释放它,也不能存储对它的引用.您可以从您所在的方法返回它,在这种情况下,您的方法名称也不应以"alloc"或"new"开头或包含"copy".

如果你想保留它,你必须通过调用retain来获取它的所有权,或者因为它的NSString,更好的是复制.如果将其分配给复制/保留属性,则可能是自动的.

在您现在发布的代码中,您在setter中出错了.你的setter应该带一个输入参数的副本,如:

- (void)setGeekName:(NSString*)gName {
    if ( geekName != gName ) {
        [geekName release];
        geekName = [gName copy];
}
Run Code Online (Sandbox Code Playgroud)

然后你还需要一个释放geekName的dealloc例程:

- (void) dealloc
{
    [geekName release];
    [super dealloc];
}
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用Objective C属性.而不是您的界面显示:

- (NSString*) geekName;
- (void) setGeekName:(NSString*)gName;
Run Code Online (Sandbox Code Playgroud)

使用属性:

@property (nonatomic, copy) NSString* geekName;
Run Code Online (Sandbox Code Playgroud)

而不是你的setter和getter的实现,让系统为你合成它们:

@synthesize geekName;
Run Code Online (Sandbox Code Playgroud)

你仍然需要dealloc方法来释放geekName.