如何释放静态类的属性

时间:2011-09-27 11:45:28

标签: objective-c memory-management

我有一个静态类女巫有两个属性,如下面......

   @interface Global : NSObject
    {

        BarcodeScanner* scanner;
        NSInteger warehouseID;
    }

    @property(assign) BarcodeScanner* scanner;
    @property(assign) NSInteger warehouseID;


    +(Global *)sharedInstance;

    @end

    #import "Global.h"

    @implementation Global
    @synthesize scanner,warehouseID;

    + (Global *)sharedInstance
    {

        static Global *globalInstance = nil;

        if (nil == globalInstance) {
            globalInstance  = [[Global alloc] init];

            globalInstance.scanner = [[BarcodeScanner alloc] init];

            globalInstance.warehouseID = 1;
        }

        return globalInstance;
    }

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

@end

现在,当我在Xcode中分析项目时,我收到了扫描器和仓库ID属性的内存泄漏警告,当我尝试以dealloc方法释放它们时... ...

[[[Global sharedInstance] scanner]release];

我收到警告“对象引用计数的错误减少......”

我应该如何解决这个问题。

非常感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

警告是因为您的代码与Analyzer使用的规则不匹配。为了避免警告

  1. 使扫描仪属性保留
  2. 将实例化或BarcodeScanner更改为自动释放
  3. 在dealloc
  4. 中为扫描程序添加一个版本

    示例(重新格式化以节省空间):

    @class BarcodeScanner;
    @interface Global : NSObject {
        BarcodeScanner* scanner;
        NSInteger warehouseID;
    }
    @property(retain) BarcodeScanner* scanner;
    @property(assign) NSInteger warehouseID;
    
    +(Global *)sharedInstance;
    @end
    
    @implementation Global
    @synthesize scanner,warehouseID;
    
    + (Global *)sharedInstance {
        static Global *globalInstance = nil;
    
        if (nil == globalInstance) {
            globalInstance  = [[Global alloc] init];
            globalInstance.scanner = [[[BarcodeScanner alloc] init] autorelease];
            globalInstance.warehouseID = 1;
        }
         return globalInstance;
    }
    
    -(void) dealloc {
        [scanner release];
        [super dealloc];
    }
    @end
    

答案 1 :(得分:0)

将它留给自动释放池

  

globalInstance.scanner = [[[BarcodeScanner alloc] init] autorelease];