2011-09-27 58 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