【问题标题】:refreshing singleton object data in object c刷新对象 c 中的单例对象数据
【发布时间】:2010-01-29 01:29:18
【问题描述】:

这里是代码

+ (SalesCollection*)sharedCollection {
@synchronized(self) {
    if (sharedInstance == nil) {
        [[self alloc] init]; // assignment not done here
    }
}
return sharedInstance;

}

+ (id)allocWithZone:(NSZone *)zone {
@synchronized(self) {
    if (sharedInstance == nil) {
        sharedInstance = [super allocWithZone:zone];
        return sharedInstance;  // assignment and return on first allocation
    }
}
   return nil; //on subsequent allocation attempts return nil
}
 - (id)copyWithZone:(NSZone *)zone {
     return self;
}
 - (id)retain {
  return self;
 }

- (unsigned)retainCount {
    return UINT_MAX;  //denotes an object that cannot be released
 }

- (void)release {
 /* Problem in Here */
    [myDict release];
sharedInstance = nil;
[sharedInstance release];
 }

 - (id)autorelease {
  return self;
 }

 // setup the data collection
  - init {
if (self = [super init]) {
    [self setupData];
}
return self;
  }

这里是我的 .h 文件

@interface MyCollection : NSObject {
NSMutableDictionary *myDict;
}

@property (nonatomic,retain) NSMutableDictionary * myDict;
+ (MyCollection*)sharedInstance ;
- (void)setupData;

我有一个 NSMutableDictionary (myDict) 包含对象数组。 现在我的问题是我想在按钮单击时刷新这些数据。所以我在 - (void)release 方法中释放此实例,然后再次尝试 Init 但这会造成大量泄漏,因为它可能不会从 myDict 中释放对象数组 那么如何实现这一点。我按照苹果的相同示例 "TheElement" 来创建单例。

谢谢

【问题讨论】:

    标签: iphone objective-c performance memory-leaks singleton


    【解决方案1】:

    您应该想出一些其他方法来刷新对象,而不是释放它。单例的全部意义在于只能有一个,并且永远不会再创建更多。不清楚 myDict 是什么,但如果它是一个实例变量,也许你可以添加这样的方法:

    - (void) refresh {
        [myDict release];
        myDict = nil;
        [self setupData];
    }
    

    【讨论】:

    • 谢谢 Ben,我添加了更多代码。 myDict 有 2 个数组,其中包含 Sale 类型的对象。希望这会有所帮助。
    • Ben,我已经尝试过了,但它仍然会造成 1000 多个泄漏(与以前相同)。让我知道我可以为您提供更具体的信息。
    • 我首先使用相同的函数 setupData 来获取所有数据,当时它不会产生任何泄漏,但它会第二次产生泄漏。
    【解决方案2】:

    如果您想摆脱代码分析器警告,请执行以下操作:

    static SalesCollection gSharedSalesCollection = NULL;
    
    + (id) sharedCollection {
        @synchronized(self) {
            if (gSharedSalesCollection == nil) {
                gSharedSalesCollection = [[self alloc] init];
            }
        }
        return gSharedSalesCollection;
    }
    

    并且有常规的 init 和 dealloc 方法。这样,您可以将类用作单例(通过使用 sharedCollection 访问它)或在例如具有常规 alloc/init/release 样式的单元测试中将其用作非单例。

    【讨论】:

    • 感谢 St3fan,但我并不想摆脱那个警告。当我再次尝试重新创建此实例时,仪器显示内存泄漏。
    【解决方案3】:

    我找到了一种方法......这就是我正在做的事情

    [self performSelectorInBackground:@selector(refreshData:) withObject:overlayView];
    

    然后我像这样在 autoreleasepool 中包装 refreshData

    NSAutoreleasePool *arPool = [[NSAutoreleasePool alloc] init];
    [[MyCollection sharedCollection] refresh];
    [arPool release];
    

    突然间所有的泄漏都会......它就像魅力一样......(:)))))

    【讨论】:

      猜你喜欢
      • 2020-02-18
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      • 2021-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多