-2

嗨,我是新手Objective-c。请指导我如何释放实例变量和保留属性的内存。在这里,我想释放保留的财产。我们释放属性吗?

  @interface VAViewController ()
  @property(nonatomic, retain)NSMutableDictionary *starDict;
  @end
  @implementation VAViewController
  @synthesize starDict = _starDict;

  -(void)setDictName
  {
     [self.starDict setValue:@"maddt" forKey:@"dictName"];
  }
  -(void)dealloc
  {
     [_starDict release];
     [super dealloc];
  }
  - (void)viewDidLoad
  {
      [super viewDidLoad];
      _starDict = [[NSMutableDictionary alloc]init];

      [self setDictName];
  }
 @end
4

4 回答 4

1

在您的 init 方法中修改:

_name = [@"" retain];

经过

_name = @"";

但是,ARC 出现在 iOS 5 中,现在我们在 iOS 7 中。如果您是 Objective-C 的新手,请使用 ARC,因为 Apple 会像您一样更好地发布您的对象。

于 2013-10-07T11:36:04.840 回答
1

要回答您的问题:

在这里,我想释放保留的财产。我们释放属性吗?

请记住,这self.starDict只是访问 ivar 的一种便捷方式,而不是单独的对象。实际上,属性只是与某些存储(ivar)相关联的几个 setter 和 getter 方法。

如果你释放 ivar,你就完成了。如果您将属性设置为 nil,这也将释放 ivar(并将其设置为 nil)并且您完成所有操作。

从不同的角度来看,考虑以下情况:

1.    [_starDict release]; _starDict = nil;

2.    self.starDict = nil;

它们完全相同(如果您的属性被声明为retain),因此您可以选择其中任何一个。你当然可以同时做这两个,但是因为做 1 或 2 会影响你的 ivar/property,那么做另一个操作就没有任何效果。

(顺便说一句,我更喜欢 niling 属性,因为它更紧凑和可读。)

希望这可以帮助。

编辑:

同样,根据使用基于属性的语法进行发布的优点,请考虑您在以下方面所做的事情viewDidLoad

- (void)viewDidLoad
{
  [super viewDidLoad];
  _starDict = [[NSMutableDictionary alloc]init];

  [self setDictName];
}

现在,如果viewDidLoad调用两次,这将泄漏内存(这可能发生在旧版本的 iOS SDK 中,在viewDidUnload调用之后)。

所以,你应该做的是在再次分配给 ivar 之前释放你的对象:

[_starDict release]; _starDict = [[NSMutableDictionary alloc]init];

或者:

self.starDict = [[[NSMutableDictionary alloc]init] autorelease];
于 2013-10-07T12:11:06.740 回答
0

如果你在最新的 Obj C 和 xcode 中使用 ARC(自动引用计数),你不需要处理这个保留、释放的东西。只需忽略并删除您的 var 并使用它。但是您编写的程序,如果您使用的是最新的 Xodes 版本 4 或 5,则需要在 xcode 中禁用 ARC。同时使用,

if ( self )
{
  self.name = @"";
}

在初始化方法中。

于 2013-10-07T11:41:23.467 回答
0

是的,您应该释放属性。更好的方法是将释放对象设置为零;

- (void) dealloc
{
    [_object release], _object = nil
    [super dealloc];
}

如果你想释放财产,你可以只使用

- (void) dealloc
{
    self.object = nil;
    [super dealloc];
}
于 2013-10-07T11:43:24.197 回答