Iphone 异步请求期间过早释放的变量

Iphone 异步请求期间过早释放的变量,iphone,objective-c,memory-management,Iphone,Objective C,Memory Management,我的内存管理和线程知识非常有限,所以我可能缺少一些真正基本的东西。我已经找到了解决这个问题的方法,但我真的,真的很困扰我,我看不到发生了什么 我有一个类,它发出两个异步HTTP请求,一个用于XML配置文件,另一个用于图像。因为在同一个类中有两个异步请求,所以我正在重用相同的nsurlconnectionelegate方法(可能是factor)。我首先异步获取配置文件并提取两个URL,分别存储为sponsorImage和sponsorUrl。然后我使用sponsorImage的值异步获取图像数据。

我的内存管理和线程知识非常有限,所以我可能缺少一些真正基本的东西。我已经找到了解决这个问题的方法,但我真的,真的很困扰我,我看不到发生了什么

我有一个类,它发出两个异步HTTP请求,一个用于XML配置文件,另一个用于图像。因为在同一个类中有两个异步请求,所以我正在重用相同的
nsurlconnectionelegate
方法(可能是factor)。我首先异步获取配置文件并提取两个URL,分别存储为
sponsorImage
sponsorUrl
。然后我使用
sponsorImage
的值异步获取图像数据。不过,我发现在获得映像后(在第二个异步事件完成后),
sponsorUrl
已经发布

我意外地发现,如果我在创建图像请求的方法中“对它做点什么”,我就可以阻止
赞助商URL
被释放——我所说的“做点什么”,就是这个意思。基本上,我的代码如下所示:

- (void) loadImage
{
    sponsorUrl = [sponsorUrl stringByAppendingString:@""];

    NSURL *url = [NSURL URLWithString:sponsorImage];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    [request setValue:dateString forHTTPHeaderField:@"If-Modified-Since"];

    NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
    [connection start];
    [connection release];   
}
如果删除此方法的第一行(将“”添加到url中),则会保留该变量。如果我移除它,它就会被释放。这对我来说毫无意义

我试着用property(非原子,retain)声明
赞助商URL
;我尝试过静态地声明
赞助商URL
;我试着在我设置的地方添加
[sponsorUrl retain]
,但没有什么不同。唯一有效的方法是在发出第二个请求之前“触摸”变量


我错过了什么

当您使用方便的构造函数时,变量会自动释放!只有在使用alloc、copy或new等方法时,才会隐式保留它们


其次,通过编写赞助商URL=。。。。您使用的不是生成的setter,而是生成的实例变量。你需要写self.sponsorUrl=@“废话”;或[self-setponsorurl:@“blah”]以使setter保留变量。

当您使用方便的构造函数时,变量将自动释放!只有在使用alloc、copy或new等方法时,才会隐式保留它们


其次,通过编写赞助商URL=。。。。您使用的不是生成的setter,而是生成的实例变量。你需要写self.sponsorUrl=@“废话”;或者[self-setponsorurl:@“blah”]以使setter保留变量。

实际上,您似乎在内存管理方面存在一些问题

很难解释发生了什么,因为您没有提供使用变量的完整代码。就拿这句话来说吧:

sponsorUrl = [sponsorUrl stringByAppendingString:@""];
您要做的是为
赞助商URL
分配一个新值;旧值(您首先初始化变量的值,即获得您提到的
retain
的值)被释放(
stringByAppendingString
伪造新对象);
sponsorURL
指向的新对象是一个自动释放的对象,其生存期并不确切:我们只知道在某个点它将被释放(可能在下一次主循环迭代中)。因此,通过“触摸”变量,您将为其指定一个新值,该值的生命周期从您触摸变量的点开始。。。无论如何,这是很不可靠的

我的建议如下:

  • 在类中定义两个属性来处理
    sponsorURL
    sponsorImage

  • 使其成为
    保留
    类型

  • 仅通过它们的访问器方法为它们赋值,即self.sponsorURL=[…]

  • 确保指定给属性的所有对象都是
    自动删除的
    对象(或者,对指定进行释放)


  • 如果您提供更多的代码,那么就有可能对其进行更彻底的检查,但是如果您遵循上述指导原则,您将不会有任何问题(大约…)

    实际上,您似乎在内存管理方面存在一些问题

    很难解释发生了什么,因为您没有提供使用变量的完整代码。就拿这句话来说吧:

    sponsorUrl = [sponsorUrl stringByAppendingString:@""];
    
    您要做的是为
    赞助商URL
    分配一个新值;旧值(您首先初始化变量的值,即获得您提到的
    retain
    的值)被释放(
    stringByAppendingString
    伪造新对象);
    sponsorURL
    指向的新对象是一个自动释放的对象,其生存期并不确切:我们只知道在某个点它将被释放(可能在下一次主循环迭代中)。因此,通过“触摸”变量,您将为其指定一个新值,该值的生命周期从您触摸变量的点开始。。。无论如何,这是很不可靠的

    我的建议如下:

  • 在类中定义两个属性来处理
    sponsorURL
    sponsorImage

  • 使其成为
    保留
    类型

  • 仅通过它们的访问器方法为它们赋值,即self.sponsorURL=[…]

  • 确保指定给属性的所有对象都是
    自动删除的
    对象(或者,对指定进行释放)


  • 如果您提供更多的代码,那么就可以更彻底地检查它,但是如果您遵循上面的指导原则,您将不会有任何问题(大约…)

    您是否尝试过[alloc init];在赞助商URL上。我有一个类似的问题,这解决了它。。。试试看,你已经试过了;在赞助商URL上。我有一个类似的问题,这解决了它。。。试试看你和@sergio是对的。我知道""是糖,但我没有意识到其中的含义。所以如果你初始化