首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >内存泄漏问题,内存管理

内存泄漏问题,内存管理
EN

Stack Overflow用户
提问于 2012-05-10 18:33:40
回答 3查看 290关注 0票数 0

我现在拥有的是

classA.h A.h

代码语言:javascript
运行
复制
@interface ClassA: NSObject <DelegateA>
-(id)initWithData:(NSData*)data;
+(Stores*)makeClass:(Class) name fromData:(NSData*)data;
@property (assign) NSMutableArray    *arr;
@property (assign) RXMLElement       *rxmlRoot;
@end

classA.m A.m

代码语言:javascript
运行
复制
   -(id)initWithData:(NSData*)data { 
        self = [super init]; 
        if (self) { 
            arr      = [[NSMutableArray array] retain]; 
            rxmlRoot = [[RXMLElement elementFromXMLData:data] retain]; 

        } 

        [rxmlRoot iterate:node with:^(RXMLElement *e){   <--------get warning at here
            NSLog(@"element is %@",e.tag);
            Detail   *detail  =   [[[Detail alloc] init] autorelease];
            [detail setLat:       [e attribute:@"lat"]];
            [detail setLon:       [e attribute:@"lon"]];

            [arr addObject:detail];

        }];
        return self; 
        }

      +(classA*)makeClass:(Class) name fromData:(NSData*)data{
            ClassA  *classA =   [[ClassA alloc] initWithData:data];
            return [storeClass autorelease] ;

        }

和RaptureXML.m

代码语言:javascript
运行
复制
+ (id)elementFromXMLData:(NSData *)data {
    return [[[RXMLElement alloc] initFromXMLData:data] autorelease];
}
- (id)initFromXMLData:(NSData *)data {
    if ((self = [super init])) {
        xml_ = [[TBXML alloc] initWithXMLData:data];
        tbxmlElement_ = xml_.rootXMLElement;
    }

    return self;    
}

警告:实例变量访问(通过'self')导致空指针取消引用

问题:为什么我会收到这个警告,以及如何解决这个问题。请在这个问题上给我建议。谢谢

EN

回答 3

Stack Overflow用户

发布于 2012-05-10 18:41:22

尝试将所有初始化代码放入

代码语言:javascript
运行
复制
if (self) {

}

这就是移动[rxmlrRoot itertate...etc ]。加入到if声明中

作为一般规则,所有初始化语法( init方法中的所有内容!)应该在那个if (self)块里。原因是当超类返回零(如果(!self) {.)时,该块外部的代码将运行。如果未调用超级方法(初始化程序只是O中的常规方法),则不希望代码继续执行。

我还被教导在我的自定义类中总是有一个指定的初始化器(这是一个可以调用super的类),我们班上的所有其他初始化程序都会调用这个指定的初始化器。例如。

代码语言:javascript
运行
复制
// Designated initializer
- (id)init
{
    self = [super init];
    if (self) {
        // initialize some stuff
    }

    // else { something went wrong and super returned nil..
    // don't put anything here

    return self;
}

// Another initializer
- (id)initWithFoo:(int)foo
{
    self = [self init]; // Now i call my designated initializer instead of super
    if (self) {
        self.foo = foo; // or something
    }
}

这样你就可以控制从那一点开始的所有流量。

票数 1
EN

Stack Overflow用户

发布于 2012-05-10 20:08:08

在调用[rxmlRoot iterate:node with:^(RXMLElement *e){ ... }]中,什么是节点?它不是局部变量,也不是iVar。它是全球性的还是存在于其他地方的?

不管它是什么,检查以确保它已经初始化了。

票数 0
EN

Stack Overflow用户

发布于 2012-05-11 01:37:45

在块内部,通过引用访问实例变量arr。由于微妙的内存管理规则,访问导致块保留self

由于if (self)是编译器的提示,即self可能为零,因此块隐式保留self可能会导致空指针取消引用。

若要修复,请检查是否为零并提前退出:

代码语言:javascript
运行
复制
if (!(self = [super init])) {
    return nil;
}

// now it is impossible for self to be nil and cause a null pointer dereference
// when self is implicitly retained by the block

// ...continue initialization
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10540171

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档