ios初学者常犯得内存管理错误

来源:互联网 发布:粘土动画制作软件 编辑:程序博客网 时间:2024/04/28 10:32
你妈调了一早上才发现原因,原来

submitBtn = [UIButtonbuttonWithType:UIButtonTypeRoundedRect];已经相当于autorelease了!!!!

谨记啊!!!

只有alloc new copy方法产生的新对象才需要release!!!!

其它的都不需要!!!

果然还是因为不熟悉!!


今天有时间所以测试了一下

nsmutablearray 在addobject时候会将引用计数+1,而在removeobject或者[array release]时候会将obj的引用计数-1 


2012-5-16号发现一个新问题,我在使用函数获取http请求时

-(void)toGetLiveUrl

{   

    NSAutoreleasePool *pool = [[NSAutoreleasePoolalloc]init];

[[AppDelegatesharedInstance]beginOverlay:@"正在获取直播视频信息..."];

id json = [[AppDelegatesharedInstance].leshiHttpgetLiveInfo:self.activityid];

[[AppDelegatesharedInstance]endOverlay];

if(json)

{

        NSDictionary *dict = (NSDictionary *)json;        

        liveUrl = [dict objectForKey:@"iphone_url"];//问题,由于此方法获取得url不是alloc出来得,因此计数为1,而且由于附近有nsautoreleasepool,当pool release时候此url//也被释放,所以下面调用toPlayVideo时候liveurl为空,报错

//因此应该改为self.liveUrl = [dict objectForKey:@"iphone_url"];

        NSLog(@"liveUrl = %@",liveUrl);

    }


[pool drain];

 

//TODO获取直播url,如果没有,则等待从faye里获取

if(liveUrl)

{

        [selfperformSelectorOnMainThread:@selector(toPlayVideo)withObject:nilwaitUntilDone:YES];

}

}


今儿又出一个问题,我申明了一个变量叫NSString *path , 使用

@property (nonatomic,assign)NSString *filepath;来申明,然后在初始化时用语句:

filepath = [documentsDirectorystringByAppendingPathComponent:@"test.txt"];

然后在onclick函数中使用该变量时就出错了,原因是因为filepath不是new或者alloc出来的变量,是属于autorelease类型的,在函数结束时(表面现象是这个)就被自动release了,所以使用出错

将其改为

@property (nonatomic,retain)NSString *filepath;

申明时用

self.filepath = [documentsDirectory stringByAppendingPathComponent:@"test.txt"];

这样会给filepath引用计数加一,就不会出现自动release现象了。




原创粉丝点击