2011-09-27 104 views
0

我有一个静态类女巫有两个属性,像下面的属性...如何释放静态类

@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我得到了警告内存泄漏的扫描仪和warehouseID属性,当我尝试释放它们在dealloc方法一样......

[[[Global sharedInstance] scanner]release]; 

我得到警告“不正确decreme nt对象的引用计数...“

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

非常感谢您的帮助。

+0

无需发布。它是自动释放对象。 :) –

+1

哦,你应该*永远不会*直接调用对象属性的释放 - >让对象本身管理该内存。 –

回答

1

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

  1. 使扫描仪属性保留
  2. 变化的实例或BarcodeScanner被自动释放
  3. 在dealloc中添加释放扫描器

例(格式化只是为了节省空间):

@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 
0

刚刚离开它来自动释放池

globalInstance.scanner = [[[BarcodeScanner的alloc] INIT]自动释放];

+0

由于该属性已分配,因此无法工作,BarcodeScanner实例将在自动释放池的下一个排出位置释放。 – zaph

+0

是的..谢谢纠正我..财产应该作出(保留)第一。我很遗憾没有提到这部分。 – samfisher