【问题标题】:Is only one release is needed in my Objective C code?我的 Objective C 代码中只需要一个版本吗?
【发布时间】:2012-12-06 16:25:43
【问题描述】:

由于某种原因我不能使用arc,所以在下面的代码中......

Foo.h

@interface Foo : NSObject

@property (nonatomic, copy) NSString * string;

@end

Foo.m

@implementation Foo

@synthesize string=_string;

- (void) bar {
    self.string = [NSString stringWithFormat:@"test1"];
    self.string = [NSString stringWithFormat:@"test2"];
}

-(void) dealloc
{
    [_string release];

    [super dealloc];
}
@end

bar 方法可能并不总是被调用,或者它们可以被多次调用。

dealloc 中只有一个release 都需要吗?

【问题讨论】:

  • 我想知道 stringWithFormat 在自动释放模式下不返回字符串吗?
  • 你为什么在这里使用stringWithFormat?这些不是格式字符串。我知道这里的重点是询问内存管理,但这仍然表明您不了解如何使用字符串。只需使用self.string = @"some text";

标签: iphone objective-c ios cocoa memory-management


【解决方案1】:

是的,因为您使用的是属性,所以 setter 方法将负责释放内存分配。它将按如下方式分配内存:

-(void)setValue:(NSString *)strValue
{
   if(string)
   {
     [string release];
     string = nil;
   }
   string = [strValue copy];
}

【讨论】:

  • 其实不,不准确。如果你设置同一个对象两次并且它只有一个引用,这将失败。
  • @H2CO3 : 请清除我的疑问..“stringWithFormat 在自动释放模式下返回一个字符串”..这是否正确?
【解决方案2】:

dealloc中只需要一个release吗?

是的。

说明:setter 方法释放分配给属性的旧对象并保留新对象。

【讨论】:

  • 我的回答正好相反:你不想在部分被释放的类上调用方法,尤其是在允许潜在的子类和 KVO 观察者时。
  • @Tommy 没有。属性的内存管理是内部的,在实际代码中不依赖。在一个对象没有调用[super dealloc]; 之前,访问它是有效的。如果 getter 和 setter 做了意想不到的事情或依赖超出其范围的东西,那就是设计糟糕的代码的结果。
  • @H2CO3,问题不在于 getter 和 setter 可能正在做一些“超出其范围”的事情——任何其他对象都可能正在观察该对象的 string 属性。当它 (anyOtherObject) 收到 KVO 通知时,它应该能够假设它正在观察的对象不是通过它的 -dealloc 方法的一半。
  • @hooleyhoop 我愿意,但我认为UIViewUIViewController 是两个独立的类是有原因的。 MVC 并不意味着允许违反封装。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-05
  • 1970-01-01
  • 2015-05-30
  • 1970-01-01
  • 1970-01-01
  • 2012-04-09
  • 2015-09-28
相关资源
最近更新 更多