有谁能告诉我,nsstring实例变量“planetname”需要由我分配/释放(如下例所示),还是在创建/分配类实例时完成?
我的理解是int和float不需要,但不确定nsstring和nsarray…

@interface PlanetClass : NSObject {
        NSString *planetName;
}
- (NSString *)planetName;
- (void)setPlanetName:(NSString *)value;
@end

这样地。。。
- (id) init {
        [super init];
        planetName = [[NSString alloc] init];
return self;
}

- (void) dealloc {
        [planetName release];
        [super dealloc];
}

***
编辑:编辑:这是另一个版本
***
int main(int argc, const char *argv[]) {

        // ** Allocated here
        PlanetClass *newPlanet_01 = [[PlanetClass alloc] init];
        NSString *newPlanetName = [NSString alloc] init];

        // ** Set the instance variable pointer here
        newPlanetName = @"Jupiter";
        [newPlanet_01 setPlanetName:newPlanetName];

        // ** Released here
        [newPlanet_01 release];
        return 0;
}

init&dealloc方法将如下所示…
- (id) init {
        [super init];
        return self;
}

- (void) dealloc {
        // Always release the current copy of planetName
        // pointed to by the class instance.
        [planetName release]
        [super dealloc];
}

setplanetname方法如下所示…
- (void)setPlanetName:(NSString *)newPlanetName {
        if (planetName != newPlanetName) {
               [planetName release];
               planetName = [newPlanetName copy];
        }
}

附言:我没有使用属性或合成,我还没有达到那个程度。
干杯-加里-

最佳答案

你的新代码仍然有问题。
在主函数中,释放newPlanetName,但这有点错误。你的PlanetClass用它的setPlanetName:方法保留了它,但是除非行星的名字改变,否则你的PlanetClass永远不会再释放它。不应该由setPlanetName:的调用方来保持字符串,适当地处理它是您的类的责任。
你以前的方法是正确的。它应该会释放行星的名称,因为你的dealloc不再需要它。您的主方法不应该释放行星的名称,因为PlanetClass返回的字符串不属于您,您将其交给stringWithString:处理。
所以,保留原来的PlanetClass方法,并从主函数中删除dealloc,您应该可以从中恢复正常。
作为一种快捷方式,您甚至可以调用[newPlanetName release]并在主函数中完全取消[newPlanet_01 setPlanetName:@"Jupiter"]变量。

10-06 11:39