2014-02-20 68 views
0

我從下面的代碼中收到一堆內存泄漏......我試圖用一種更好的方式重寫它,但真的想不出別的什麼。建議將不勝感激。以下是消息發送到的對象。內存泄漏類的方法

Packet *packet; 
packet = [PacketAudioBuffer packetWithData:data]; 

PacketAudioBuffer.m文件 - >

+ (id)packetWithData:(NSData *)data 
{ 
    int totalSize = [data length]; 

    int packetNumber = [data pm_int32AtOffset:4]; 

    return [[self alloc] initWithAudioBufferData:data totalSize:totalSize packetNumber:packetNumber]; 
} 

- (id)initWithAudioBufferData:(NSData *)data 
       totalSize:(UInt32)totalSize 
      packetNumber:(UInt32)packetNumber 
{ 

if ((self = [super initWithType:PacketTypeAudioBuffer])) 
{ 
     // this is where audioBufferData is set. 
     self.audioBufferData = data; 
     self.totalSize = totalSize; 
     self.packetNumber = packetNumber; 
} 
return self; 
} 
+0

任何調用packetWithData負責釋放結果。 – Dave

回答

0

你可以試試這個。 。 。

+ (id)packetWithData:(NSData *)data 
{ 
    int totalSize = [data length]; 

    int packetNumber = [data pm_int32AtOffset:4]; 

    return [[[self alloc] initWithAudioBufferData:data totalSize:totalSize packetNumber:packetNumber] autorelease]; 
} 
0

這聽起來像你不使用ARC,所以alloc結果從不是新的方法,分配回,保留或沒有自動釋放是不正確複製。在packetWithData:的return語句中添加一個自動發佈的版本。

此外,我建議閱讀內存管理指南。這並不長,而這件事真的很重要。

0

不需要您實施的類方法。儘量簡化這樣的:

- (id)initWithAudioBufferData:(NSData *)data 
{ 

    if ((self = [super initWithType:PacketTypeAudioBuffer])) 
    { 
     // this is where audioBufferData is set. 
     self.audioBufferData = data; 
     self.totalSize = [data length]; 
     self.packetNumber = [data pm_int32AtOffset:4]; 
    } 
    return self; 
} 

,並調用它是這樣的:

PacketAudioBuffer *packet = [[PacketAudioBuffer alloc] initWithAudioBufferData:data]; 

希望這有助於。