【问题标题】:Is retainCount giving me the correct information for my NSDate?retainCount 是否为我的 NSDate 提供了正确的信息?
【发布时间】:2011-06-02 12:01:30
【问题描述】:

我有 NSDate 属性

在.h中

...
@interface MyAppDelegate : NSObject <UIApplicationDelegate> {
...
      NSDate *pageStartDate;
...
}
...
@property (nonatomic, retain) NSDate *pageStartDate;
...

在.m中

...
-(void)myMethod
{
   ...
   // set date of start showing page
   NSDate *tempStartDate = [NSDate date];
   [tempStartDate retain];
   pageStartDate = tempStartDate;
   [tempStartDate release];
   ...
}
...

运行此代码后,[tempStartDate retainCount] = 1 - 正常吗? 如果我写self.pageStartDate = tempStartDate 而不是[pageStartDate retainCount] = 2。

NSDate 的使用是否正确?

【问题讨论】:

  • 如果你写@syncronize pageStartDate;这意味着保留计数1是正常的
  • 我当然写了@synchronize。属性“pageStartDate”中需要我,但是当我使用 self.pageStarDate 时,此 retainCount 增加到 2。

标签: ios memory properties nsdate retaincount


【解决方案1】:

如果您不写self.pageStartDate,它将不会使用该属性,所以是的,预计保留计数为 1。另请注意,此实例是自动发布的(因为您使用 [NSDate 日期] 创建它),因此稍后会发布。

如果您使用该属性,则不需要 retainrelease 语句。

【讨论】:

    【解决方案2】:

    问题不只是你的NSDate 而是因为你使用了retainCount

    注释:

    NSDate *tempStartDate = [NSDate date]; // No alloc, retain, copy, or mutableCopy - so assume autoreleased instance
    [tempStartDate retain]; // You call retain - you own this now
    pageStartDate = tempStartDate; // Not going through the setter. :(
    [tempStartDate release];  // You've released this correctly, except for the step above.
                              // pageStartDate is now pointing to a garbage pointer.
    

    通过释放您保留的内容,您做了正确的事情,但 pageStartDate 没有保留该值。

    试试这个

    self.pageStartDate = [NSDate date];
    

    由于您将 retain 用于 pageStartDate 属性,这将为您保留该值。

    但是 - 尝试使用 retainCount 来检查您的内存管理基本上是错误的。

    【讨论】:

    • 在这种情况下,接受我的回答和/或投票是在 SO 上感谢某人的常用方式。
    • 但我想:self.pageStartDate = [NSDate date]; NSLog(@"[pageStartDate retainCount] = %i", [pageStartDate retainCount]); 在日志中我看到[pageStartDate retainCount] = 2 - 这正常吗?因为我的代码中有一个 releasepageStarDate - 在 -(void)dealloc
    • 不要使用retainCount。它没有告诉您有关运行代码的任何信息。请参阅我的答案中的链接。只需担心内存管理规则,不要看retainCount 告诉你什么。请记住 - 日期值为autoreleased - 这意味着它将在自动释放池耗尽时释放,可能不会立即释放。
    • 哎呀,我没有在你的答案中找到链接。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    • 1970-01-01
    • 2014-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多