当前位置: 代码迷 >> Iphone >> 内存管理有关问题,
  详细解决方案

内存管理有关问题,

热度:110   发布时间:2016-04-25 06:44:55.0
内存管理问题,,,
小弟以前是搞过.net和java,从来没关心什么内存溢出问题,最近因为需要,接触了objective-c ,被这个问题搞得好晕,不知道啥时候该 retain,啥时候该release。反正加上这些,程序就挂掉。。请个位大侠指点下,比如下面这段代码,被注释掉得地方是我认为该加的retain或release的地方,但是实际并不是这样。能不能给我解释一下呢?小弟在这里拜谢了。。。代码可能写得很烂,习惯了.net,不知道哪些该注意,请大家耐着性子看。。。
C/C++ code
-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{    NSString *urlString = [[request URL] absoluteString];    if ([urlString hasPrefix:@"cmd:"]) {        NSRange range = [urlString rangeOfString:@"?"];//这种非指针类型不需要释放么?        NSString *cmd = [[urlString substringToIndex:range.location] substringFromIndex:4];//为什么在最后release这个变量时也会挂掉?        NSString *paramsString = [urlString substringFromIndex:range.location+range.length];        NSArray    *params = [paramsString componentsSeparatedByString:@"&"];        if ([cmd caseInsensitiveCompare:@"changeLocation"] == NSOrderedSame) {            NSString *lat,*lng;            for (NSObject *item in params) {                NSString *param = (NSString *)item;                range = [param rangeOfString:@"="];                NSString *name = [param substringToIndex:range.location];                NSString *value = [param substringFromIndex:range.location + 1];                if ([name caseInsensitiveCompare:@"lat"]== NSOrderedSame) {                    lat = value;                    //[lat retain];                } else if ([name caseInsensitiveCompare:@"lng"] == NSOrderedSame) {                    lng = value;                    //[lng retain];                }                //[name release];                //[value release];                //[param release];            }            [coordinate setText:[NSString stringWithFormat:@"当前纬度为:%@经度为:%@",lat,lng]];            //[lat release];            //[lng release];        }        //[cmd release];        //[paramsString release];        //[params release];    }    return YES;}




------解决方案--------------------
哎,原则上是你alloc或者retain了,你就release,你没有alloc或者retain的,就不要release。
------解决方案--------------------
这个要从创建对象的不同方法说起:
1.使用alloc/init来创建对象
C/C++ code
NSArray *array = [[NSArray alloc]init];//需要手动release[array release];
------解决方案--------------------
不需要。。。

一般来说,NSString 只要不alloc和retain,声明出来的临时变量是不需要手动release的

系统会默认的把它们 添加到自动里面,属于系统管理,而不是开发者

还有一点需要注意的是,对象几乎都是指针(不是指针的没有发现过,可能是我经验不足),注意指向的内存空间的释放,一般就没有问题了。只要知道 指向的内存是自己 声请管理的,还是系统自己管理的就OK啦
------解决方案--------------------
alloc,init,new 创建的对象需要release,手动retain的对象需要release,基本数据类型不需要释放,记住这些就差不多了,具体可以看我博客。这还要看你用的Xcode版本,iphone开发和普通mac开发也是不同的。但上面那个原则是不会变的。
------解决方案--------------------
建议LZ哥看看书吧!另外LZ哥签名很霸气!
  相关解决方案