首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >方法来自@synthesize?

方法来自@synthesize?
EN

Stack Overflow用户
提问于 2010-02-19 01:08:28
回答 3查看 159关注 0票数 0

当你合成一个属性(见下文)

代码语言:javascript
复制
@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。

代码语言:javascript
复制
[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];

但您也可以使用以下命令释放对象:

代码语言:javascript
复制
// Releases the object (frees memory) and sets the object pointer to nil.
[self setMoon: nil];

当然,每个类都会有相应的交易记录。

代码语言:javascript
复制
// Moon
-(void)dealloc {
    [name release];
    [super dealloc];
}

// Planet
-(void)dealloc {
    [name release];
    [moon release];
    [super dealloc];
}

我没搞错吧?

加里

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-02-19 01:16:46

除非使用retain/copy属性将planet对象声明为其他类中的属性,否则不能以这种方式释放它。

当您使用retain/copy声明一个属性时,产生的setter将释放旧值并分配新值,在此过程中保留或复制它。如果您传递nil,您将释放旧值并分配nil,保留或复制它,保留/复制nil为nil,因此有效地最终释放旧值并将nil分配给ivar。

这是一种可以接受的释放实例变量的方式。

为了能够以这种方式释放您的newPlanet实例,您必须在一个类中使用retain或copy将其声明为属性。

再举一个例子,由于planet对象以这种方式声明其属性,因此可以使用此方法释放这些属性。

或者在Planet类的dealloc方法中,您可以这样做:

代码语言:javascript
复制
self.name = nil;

这将释放名称并将nil赋值给它。

票数 2
EN

Stack Overflow用户

发布于 2010-02-19 22:52:04

“您还可以释放对象”

是的,只要你没有用assign属性声明它。

正如您可能知道的,使用声明属性的原因之一(尽管可能不是主要原因)是您可以这样做:

代码语言:javascript
复制
self.moon = aMoon;

而不是;

代码语言:javascript
复制
[self setMoon:aMoon];

它们是等效的。这意味着您的重新分配可能如下所示:

代码语言:javascript
复制
self.moon = nil;  // Releases and sets to nil

但请记住,永远不要只做以下事情:

代码语言:javascript
复制
moon = nil; // Sets to nil, doesn't release

很好的做法是不仅释放对象,而且像您一样将变量设置为nil,否则其他代码可能会错误地尝试使用留在变量中的指针。

票数 1
EN

Stack Overflow用户

发布于 2010-02-19 01:18:44

你的例子展示了一个类的ivars (Planet的那些)的合成,但另一个类的使用(不管"self“是什么)。上一个示例中"self“的"newPlanet”属性是否也合成为(retain)?如果是这样,那么:是的,将newPlanet设置为nil将释放self的旧"newPlanet“。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2290579

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档