Objective-C对象泄漏错误



对于下面的程序,我得到以下错误-在第50行分配的对象可能发生泄漏。第50行指向这条线自我。receivedData = [[NSMutableData数据]retain];我试图在此语句后释放receiveData,但这会给我一个错误"对象发送自动释放太多次。"我不确定我这样做是否正确。请帮助!

   - (void)viewDidLoad {
        NSURLRequest *theRequest = 
        [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://{your ip}:8080/activiti-rest/service/process-definitions?start=0&size=10&sort=id&order=asc"]                            cachePolicy:NSURLRequestReloadIgnoringLocalCacheData
                     timeoutInterval:10.0];
        NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
        if (theConnection) {       
            self.receivedData = [[NSMutableData data] retain];
        } else {

            UIAlertView *connectFailMessage = [[UIAlertView alloc] initWithTitle:@"NSURLConnection " message:@"Failed in viewDidLoad"  delegate: self cancelButtonTitle:@"Ok" otherButtonTitles: nil];
            [connectFailMessage show];
            [connectFailMessage release];
        }
        [theConnection autorelease];
    }

Edit:在头文件中声明为@property(nonatomic,assign) NSMutableData *receivedData;
它工作后,我删除了这一行[连接自动释放]。我保留了指派属性,因为是在头文件中,并添加了[self。如你所要求的。它之前没有工作,因为我保留了这一行[连接自动释放]。我添加了它,因为我想知道我是否也必须释放连接对象。你能解释一下为什么不用公布吗?它没有在代码的任何地方发布,它仍然可以工作??

如果没有看到更多的代码,分析器可能会感到困惑。

你的平衡释放在哪里?在dealloc吗?

为什么属性不是 retain ?


您也应该在-dealloc中释放对象。而且你还没有回答为什么这个物体不是retain——这似乎很奇怪。

self。receivedData指向一个属性。这个属性很可能设置了"保留"标志。因此,它是为您保留的,并且您在行中显式保留是无关的,并导致问题。

receivedData属性是否在相应的头文件中声明为retain ?这意味着当您将对象分配给它时,该对象将自动发送retain消息。你不需要自己调用retain

问题可能是您正在分配receivedData而没有首先释放它。试一试:

[self.receivedData release];
self.receivedData = [[NSMutableData data] retain];

编辑:上述原因。receivedData被声明为一个"assign"属性。因此,如果对它进行赋值而不首先释放它,那么如果receivedData先前包含保留的对象,就会发生内存泄漏。你当然可以将属性从分配改为保留,但是我怎么知道他一开始就没有使用分配的好理由呢?

最新更新