gpt4 book ai didi

ios - Objective-C ,[NSString initWithFormat] 究竟是做什么的?

转载 作者:行者123 更新时间:2023-11-28 19:09:43 26 4
gpt4 key购买 nike

我只想知道下面第 1 行和第 2 行的区别:

_subtitle = @"Test"; //Line 1
_subtitle = [NSString stringWithFormat: @"Test"]; //Line 2

如果我问那个问题,那是因为我在使用 MKAnnotation 时遇到了问题。在下面的方法中,我尝试更新 MKAnnotation 的字幕委托(delegate)属性(非原子、复制和只读)。但是看起来我在使用第 2 行时遇到了一个僵尸,而在使用第 1 行时却什么也没有。所以我的问题是为什么?

- (void) initCoordinateWithAddress:(NSString*)address;
{
self.address = address;

CLGeocoder *geocoder = [[CLGeocoder alloc] init];
[geocoder geocodeAddressString: address completionHandler:^(NSArray *placemarks,NSError *error)
{
CLPlacemark *place = [placemarks objectAtIndex:0];
_coordinate = place.location.coordinate;
_title = self.address;
_subtitle = @"Test"; //Line 1: don't crash
_subtitle = [NSString stringWithFormat: @"Test"]; //Line 2: crash
//_subtitle = [[NSString stringWithFormat: @"[%.2f,%.2f]", self.coordinate.latitude, self.coordinate.longitude] copy];
_isInit = YES;

[self.customDelegate didCalculateCoordinate: place.location.coordinate forAnnotation: self];
}];

我实际上已经通过使用方法 copy 解决了我的问题,但我仍然不明白第 1 行和第 2 行之间有什么区别,如果有人能帮助我理解有什么区别,我将不胜感激。

编辑:

1- 我没有使用 ARC

2- _subtitle 来自@synthesize subtitle = _subtitle;副标题是 MKAnnotation 协议(protocol)的一部分,具有非原子、只读和复制属性

问候,西里尔

最佳答案

如果您不使用 ARC,答案很简单,就是 Anoop Vaida 写的。但是,我认为需要进一步解释。

这一行

_subtitle = @"Test";

创建对字符串文字的引用。如果你在 foundation 的当前实现中查看其保留计数的峰值,你会发现它是一个非常大的数字(我认为是 NSIntegerMax)。如果 -release-retain 的代码遇到保留计数的这个值,它们不会递减或递增它。因此,字符串文字具有无限的生命周期。

这一行:

_subtitle = [NSString stringWithFormat: @"Test"];

创建一个您不拥有的字符串。除非您采取措施声明所有权,否则它可能会随时消失,最有可能是在自动释放池耗尽时。您的选择是创建一个您拥有的字符串

_subtitle = [[NSString alloc] initWithFormat: @"Test"];

或保留它。

_subtitle = [NSString stringWithFormat: @"Test"];
[_subtitle retain]; // Can be combined with the previous line if you like.

或复制它

_subtitle = [[NSString stringWithFormat: @"Test"] copy];

请注意,在所有情况下,您都需要在覆盖之前释放 _subtitle 的先前值,否则会出现泄漏,例如

[_subtitle release];
_subtitle = [[NSString alloc] initWithFormat: @"Test"];

这就是为什么拥有特性更好。仅仅因为 MKAnnotation 字幕属性是只读的,并不意味着您不能用您自己的读/写属性覆盖它。例如

@interface MyAnnotation : NSObject <MKAnnotation>

// other stuff

@property (readwrite, copy, nonatomic) NSString* subtitle;

@end

如果你再综合它,你会得到所有正确的内存管理代码,你就可以了

[self setSubtitle: [NSString stringWithFormat: @"test"]];

或者,如果你必须使用点符号

self.subtitle = [NSString stringWithFormat: @"test"];

关于ios - Objective-C ,[NSString initWithFormat] 究竟是做什么的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16815892/

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