gpt4 book ai didi

iphone - 了解 Objective-C 中的内存管理

转载 作者:搜寻专家 更新时间:2023-10-30 20:07:18 26 4
gpt4 key购买 nike

我有以下代码可以正常工作,但我不确定我是否正确理解了一些内存管理概念:

#import "mapPoint.h"

@implementation mapPoint
@synthesize coordinate, title, subtitle;

-(id)initWithCoordinate:(CLLocationCoordinate2D)c title:(NSString *)t {
[super init];
coordinate = c;
[self setTitle:t];
// Set date as subtitle
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateStyle:NSDateFormatterMediumStyle];
[dateFormatter setTimeStyle:NSDateFormatterShortStyle];
NSString *myDate = [dateFormatter stringFromDate:[NSDate date]];
[self setSubtitle:myDate];
[dateFormatter release];
// Look for city and state; when found, set it in subtitle, replacing date
geocoder = [[MKReverseGeocoder alloc] initWithCoordinate:c];
[geocoder setDelegate:self];
[geocoder start];
return self;
}
-(void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFailWithError:(NSError *)error {
NSLog(@"%@", error);
}
-(void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFindPlacemark:(MKPlacemark *)placemark {
[self setSubtitle:[NSString stringWithFormat:@"City: %@, State: %@", [placemark locality], [placemark administrativeArea]]];
}
-(void)dealloc {
[title release];
[subtitle release];
[geocoder release];
[super dealloc];
}

@end
  1. 当我通过 alloc 方法创建地理编码器对象时,我必须释放它(在 dealloc 中完成)。正确吗?
  2. 在方法 reverseGeocoder:didFindPlacemark 中,使用便捷方法 stringWithFormat 创建了一个 NSString。因为我没有使用 alloc,所以我不负责释放它(我假设该方法使用 autorelease)。对吗?
  3. placemark 对象返回两个 NSString,localityadministrativeArea。同样,我没有创建这些字符串,所以我不会释放它们。但是,鉴于它们是我的 mapPoint 对象的字幕属性的一部分,我不希望这些字符串消失,但它们可能是使用 autorelease 创建的。属性 subtitle 使用 retain 声明。假设它将保留使用便捷方法创建的 NSString 以防止其过早销毁是否正确?

谢谢,如果问题很复杂,我们深表歉意……主题是。

最佳答案

  1. geocoder 是你们类的 ivar 吗?那么你的代码是正确的。请注意,由于地理编码器在返回结果后无用,您可以在适当的委托(delegate)方法中释放它(并将 ivar 设置为 nil)以允许更早回收内存。
  2. 大部分是正确的。如果您使用以“new”开头或包含“copy”的方法来获取对象的实例,您也将负责释放它。
  3. 正确的所有点。请注意,如果您要自己实现 setSubtitle: 而不是允许 @synthesize 这样做,您将负责在您的 setSubtitle 实现中实现该行为:

编辑:

我在评论中看到您特别关注第 3 点。来自 [placemark locality][placemark administrativeArea] 的字符串作为参数传递给 NSString 的 stringWithFormat 方法,之后它们就无关紧要了,因为它们的内容已被复制到 stringWithFormat 返回的新字符串中。这是您真正需要担心的唯一字符串,正如已经指出的那样,setSubtitle: 将保留该字符串。

关于iphone - 了解 Objective-C 中的内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5215371/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com