当你合成一个属性(见下文)
@interface CelestialBody : NSObject {
NSString *name;
}
...
@interface Planet : NSObject {
NSString *name;
int mass;
CelestialBody *moon;
}
@property(nonatomic, retain) NSString *name;
@property(assign) int *mass;
@property(nonatomic, retain) CelestialBody *moon;
...
@implementation Planet
@synthesize name;
@synthesize mass;
@synthesize moon;
...您可以为每个iVars (即)获取setter和getter。
[newPlanet setName:@"Jupiter"];
[newPlanet setMass:57];
NSString *closestName = [newPlanet name];
int largestMass = [newPlanet mass];
CelestialBody *newMoon = [[CelestialBody alloc] initWithName:@"Callisto"];
[self setMoon:newMoon];
[newMoon release];但您也可以使用以下命令释放对象:
// Releases the object (frees memory) and sets the object pointer to nil.
[self setMoon: nil];当然,每个类都会有相应的交易记录。
// Moon
-(void)dealloc {
[name release];
[super dealloc];
}
// Planet
-(void)dealloc {
[name release];
[moon release];
[super dealloc];
}我没搞错吧?
加里
发布于 2010-02-19 01:16:46
除非使用retain/copy属性将planet对象声明为其他类中的属性,否则不能以这种方式释放它。
当您使用retain/copy声明一个属性时,产生的setter将释放旧值并分配新值,在此过程中保留或复制它。如果您传递nil,您将释放旧值并分配nil,保留或复制它,保留/复制nil为nil,因此有效地最终释放旧值并将nil分配给ivar。
这是一种可以接受的释放实例变量的方式。
为了能够以这种方式释放您的newPlanet实例,您必须在一个类中使用retain或copy将其声明为属性。
再举一个例子,由于planet对象以这种方式声明其属性,因此可以使用此方法释放这些属性。
或者在Planet类的dealloc方法中,您可以这样做:
self.name = nil;这将释放名称并将nil赋值给它。
发布于 2010-02-19 22:52:04
“您还可以释放对象”
是的,只要你没有用assign属性声明它。
正如您可能知道的,使用声明属性的原因之一(尽管可能不是主要原因)是您可以这样做:
self.moon = aMoon;而不是;
[self setMoon:aMoon];它们是等效的。这意味着您的重新分配可能如下所示:
self.moon = nil; // Releases and sets to nil但请记住,永远不要只做以下事情:
moon = nil; // Sets to nil, doesn't release很好的做法是不仅释放对象,而且像您一样将变量设置为nil,否则其他代码可能会错误地尝试使用留在变量中的指针。
发布于 2010-02-19 01:18:44
你的例子展示了一个类的ivars (Planet的那些)的合成,但另一个类的使用(不管"self“是什么)。上一个示例中"self“的"newPlanet”属性是否也合成为(retain)?如果是这样,那么:是的,将newPlanet设置为nil将释放self的旧"newPlanet“。
https://stackoverflow.com/questions/2290579
复制相似问题