设置MKAnnotation标题和SubTitle时泄漏

时间:2011-12-14 10:12:26

标签: objective-c memory-leaks mkmapview

我发现以下代码泄漏!为什么我有这个问题?是因为它复制了NSString中的属性。有办法解决这个问题吗?

@property (nonatomic, copy) NSString *reg;
@property (nonatomic, copy) NSString *reg2;
@property (nonatomic, copy) NSNumber *altitude;
@property (nonatomic, copy) NSNumber *heading;

-(void)updateTitles{

    self.title=[NSString stringWithFormat:@"%@ %@",self.reg,self.reg2];
    self.subtitle = [NSString stringWithFormat:@"%@ft %@°",self.altitude,self.heading];

}

此方法中每个属性设置的泄漏率为50%。

更新

原来这是从一个区块调用的。为了解决这个问题,我做了以下几点。

以下工作但仍然泄漏,现在明确保留自我。

-(void)updateTitles{
    __block NSString *thisTitle = [[NSString alloc] initWithFormat:@"%@ %@",self.reg1,self.reg2];
    __block NSString *subTitle = [[NSString alloc] initWithFormat:@"%@ft %@°",self.altitude,self.heading];


    dispatch_queue_t mainQueue = dispatch_get_main_queue();
    dispatch_async(mainQueue,^(){
        self.title=thisTitle;
        self.subtitle = subTitle;

        [thisTitle release];
        [subTitle release];
    });
}

然而,泄漏以及理论上应该使用的以下内容在setTitle方法上给出了一个无法识别的选择器!!!!!

-(void)updateTitles{
    __block NSString *thisTitle = [[NSString alloc] initWithFormat:@"%@ %@",self.reg1,self.reg2];
    __block NSString *subTitle = [[NSString alloc] initWithFormat:@"%@ft %@°",self.altitude,self.heading];

    __block __typeof__(self) blockSelf = self;

    dispatch_queue_t mainQueue = dispatch_get_main_queue();
    dispatch_async(mainQueue,^(){

        [blockSelf setTitle:thisTitle];
        [blockSelf setSubtitle:subTitle];

        [thisTitle release];
        [subTitle release];
    });
}

1 个答案:

答案 0 :(得分:1)

假设您没有使用ARC,具有上述属性的对象是否具有dealloc方法,并且是否正确释放了ivars?该对象本身是由保留它的任何对象释放的吗?

覆盖getter而不是设置标题/副标题会有所不同:

-(NSString *) title
{
    return [NSString stringWithFormat:@"%@ %@",self.reg,self.reg2];
}