gpt4 book ai didi

objective-c - 实例变量的分配?

转载 作者:搜寻专家 更新时间:2023-10-30 20:04:52 25 4
gpt4 key购买 nike

谁能告诉我 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];
}
}

PS:我没有使用属性或合成,我还没有走到那一步。

干杯-加里-

最佳答案

您的代码是有效的,但可能没有理由将 planetName 初始化为空字符串。 Objective-C 的一个很好的特性是您可以将消息发送到一个 nil 对象而不会产生任何后果。如果您的类已初始化并且您从不调用 -setPlanetName:,则 planetName 将为 nil(实例变量始终初始化为 nil),因此当您的 -dealloc 方法调用 [planetName release],什么都不会发生。

通常,最佳实践是在设置 NSString 实例变量时使用 -copy,在将大多数其他对象设置为实例变量时使用 -retain。因此,您的 -setPlanetName: 方法看起来像这样:

- (void)setPlanetName:(NSString *)newPlanetName {
NSString *tempPlanetName = [newPlanetName copy];
[planetName release];
planetName = tempPlanetName;
}

关于objective-c - 实例变量的分配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1400994/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com