首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >这是对付伊瓦尔斯的正确方式吗?

这是对付伊瓦尔斯的正确方式吗?
EN

Stack Overflow用户
提问于 2012-02-06 17:28:53
回答 3查看 197关注 0票数 3

我读过很多关于getter和setter的主题。我知道它们是什么,为什么有用。不同的消息来源有不同的释放依瓦尔的方式。我的困惑开始了

代码语言:javascript
运行
复制
@interface CoolClass : NSObject
{
  NSString *name;
}

@property (nonatomic, copy) NSString *name;
@end

@implementation CoolClass
@synthesize name = _name;

-(id)init
{
  if(super = [self super])
  {
     self.name = @"Jo";
  }
  return self;
}

-(void)dealloc
{
  [self.name release], self.name = nil;
}
@end

这是释放/释放依瓦尔的正确方式吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-02-06 17:43:03

您将希望在大多数情况下使用访问器,但不要在部分构造的状态下使用,因为它们可以具有negative side-effects。下面是它的实现方式:

代码语言:javascript
运行
复制
- (id)init
{
  if((self = [super init])) {
     // self.name = @"Jo"; << don't use accessors in initializer

     _name = [@"Jo" copy]; << good
  }
  return self;
}
// added for another variation:
- (id)initWithName:(NSString *)inName
{
  if((self = [super init])) {
     _name = [inName copy];
  }
  return self;
}

- (void)dealloc
{
    // don't use accessors in dealloc
    // don't release the result of a getter (release the result of the retained or copied result)
    // [self.name release], self.name = nil;  

    // instead:
    [_name release], _name = nil;
    [super dealloc]; << compiler should have warned you about this one
}

注意:在init__的情况下,字符串文字是不朽的,如果复制它也没有关系,因为副本只会返回自身。我的偏好是为了清晰起见只是“复制”不朽的东西,尽管这是不必要的。

票数 2
EN

Stack Overflow用户

发布于 2012-02-06 17:54:31

以下是我的建议:

代码语言:javascript
运行
复制
@interface CoolClass : NSObject
@property (nonatomic, copy) NSString *name;
@end

@implementation CoolClass
@synthesize name = _name;

-(id)init
{
  if(super = [self super])
  {
     self.name = @"Jo";
  }
  return self;
}

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

@end

备注:

  1. 不需要在头文件的{ ... }中显式声明ivar。它们将在您合成您的属性时自动创建。显式ivar是一个遗留概念,从iOS 3开始不再需要。
  2. 你不应该在dealloc中使用self.name,因为这会调用getter方法,这可能会做额外的工作,而不仅仅是获取ivar。通常情况下,使用getter方法是一个很好的做法,但是在dealloc中你应该直接释放ivar,在释放它们之后将ivar设置为nil是一个好的做法,但是在dealloc中这是不必要的,因为dealloc之后没有任何代码被执行,所以指针不会被引用again.
  3. Normally (在dealloc之外),如果你想释放ivar,你应该使用这样的setter将它设置为nil:

=

  1. ;这会自动释放它,并将它设置为nil。这等效于_name release,_name = nil;
票数 1
EN

Stack Overflow用户

发布于 2012-02-06 18:05:44

代码语言:javascript
运行
复制
@interface CoolClass : NSObject
{
  NSString *name;
}

你在这里声明了一个实例变量'name';现在不需要在头文件中声明ivars。只需使用属性并使编译器为您合成ivar。

代码语言:javascript
运行
复制
@property (nonatomic, copy) NSString *name;

在这里,我们有一个属性声明,它指定应该使用对象的副本进行赋值,并向先前的值发送释放消息。

在实现中,你想要合成你的属性:

代码语言:javascript
运行
复制
@synthesize name = _name;

这段代码告诉编译器为名为'name‘的属性生成一个getter和setter,并使用名为'_name’的实例变量来存储值。所以你现在有两个ivars 'name‘和'_name’。

init方法应该是这样:

代码语言:javascript
运行
复制
-(id)init
{
  if(self = [super init])
  {
     name = @"This is ivar declared between {}";
     _name = @"synthesized ivar";

  }
  return self;
}

和dealloc:

代码语言:javascript
运行
复制
-(void)dealloc
{
  [name release];
  [_name release];
  [super dealloc];
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9158030

复制
相关文章

相似问题

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