2013-11-14 99 views
0

我正在开发一个IOS应用程序。我用XCode工具进行了分析,如果我不写autorelease,然后显示“潜在的内存泄漏”消息。这是以下代码块中的错误。我不确定。IOS @property,@synthesize内存泄漏

//TransferList.h 
@property (nonatomic,retain) WebServiceAPI *webApi; 


//TransferList.m 
@implementation TransferList 

@synthesize webApi; 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.webApi = [[[WebServiceAPI alloc] init] autorelease]; 
} 

- (void)dealloc 
{  

    [webApi release]; 
    [super dealloc]; 
} 
+0

这不是一个巨大的东西,但通常你会做'@合成的WebAPI = _webApi;'我会得到的内存泄漏有时并改变这种方式似乎帮助。我相信'iOS6'这个是自动完成的,所以你根本不需要'@ synthesize'。 – Popeye

+0

也许你可以分享一些关于你的web服务类的细节。仪器会告诉你泄漏物体的分配位置,而不是泄漏的根源。你是否通过静态分析器运行你的代码(“分析”Xcode的“产品”菜单)?可能是一个保留周期(例如,引用'self'的块变量)或类似重复保留Web服务对象的'NSTimer'。 – Rob

+0

另外,您是否确认视图控制器本身正在发布(即视图控制器本身没有保留周期)?也许在'dealloc'中放置断点或'NSLog'并确保它被调用。 – Rob

回答

3

如果这是MRC下编译(和它显然是),然后在不autorelease会出现内存泄漏。这是绝对正确的。

alloc说你想要的对象
分配到这是retain财产的所有权还声称所有权(由酒店)
dealloc你释放属性(属性不会拥有该对象的任何更)。

如果没有autoreleaseviewDidLoad将永远失去对象的所有权,你将有一个内存泄漏,因为该对象永远不会被释放。

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    //create the object and get the ownership 
    WebServiceAPI *api = [[WebServiceAPI alloc] init]; 

    //let our property also own this object 
    self.webApi = api; 

    // I don't want to own the object anymore in this method 
    // (of course, using autorelease is simpler) 
    [api release]; 
} 

- (void)dealloc {  
    //our property doesn't want to own the object any more 
    [webApi release]; 
    [super dealloc]; 
} 
+0

是这个项目的非ARC项目。所以这是正确的? – hiwordls

+0

他已经有'autorelease'了。我怀疑他的web服务类中保留了循环。 – Rob

+0

@Sulthan所以这是正确的或不是“self.webApi = [[[WebServiceAPI alloc] init] autorelease];” ? 。 – hiwordls