Возьмите приведенный ниже пример:
- (NSString *)pcen NS_RETURNS_RETAINED {
return (__bridge_transfer NSString *)CFURLCreateStringByAddingPercentEscapes(NULL, (__bridge CFStringRef) self, NULL, (CFStringRef) @"!*'();:@&=+$,/?%#[]", kCFStringEncodingUTF8);
}
Правильно ли там поставить NS_RETURNS_RETAINED
?
Другой пример:
+ (UIImage *)resizeImage:(UIImage *)img toSize:(CGSize)size NS_RETURNS_RETAINED {
UIGraphicsBeginImageContextWithOptions(size, NO, 0.0);
[img drawInRect:...];
UIImage *resizedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return resizedImage;
}
Это кажется более сложным, так как возвращаемый UIImage является результатом метода Get. Тем не менее, контекст графики, из которого он был получен, был создан в рамках метода, так же верно и здесь NS_RETURNS_RETAINED
?
И третий пример:
@property (readonly) NSArray *places;
---
@synthesize places=_places;
---
- (NSArray *)places {
if (_places)
return _places;
return [[NSArray alloc] initWithObjects:@"Unknown", nil];
}
Не знаю, что делать здесь, поскольку возвращаемый объект может быть вновь создан или нет.
И последний вопрос; предположительно NS_RETURNS_RETAINED
не требуется, если возвращенный объект является результатом метода autorelease'ed. Поэтому скажем, что возврат в последнем примере был изменен на
return [NSArray arrayWithObject:@"Unknown"];
что было бы лучше всего?