我看到了this question中描述的情况,但有一个重要的警告。请考虑以下代码:
@implementation UIAlertView (Factory)
+ (instancetype)alertViewWithTitle:(NSString *)title
message:(NSString *)message
delegate:(id)delegate
cancelButtonTitle:(NSString *)cancelButtonTitle
otherButtonTitles:(NSArray *)otherButtonTitles
{
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:title message:message delegate:delegate cancelButtonTitle:cancelButtonTitle otherButtonTitles:nil];
for (NSString *otherButtonTitle in otherButtonTitles)
{
[alertView addButtonWithTitle:otherButtonTitle];
}
return alertView;
}
@end
如果我这样做:
@property (nonatomic, weak) UIAlertView *alertView;
...
self.alertView = [UIAlertView alertViewWithTitle:@"Hi" message:nil delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
[self.alertView show];
当我构建调试模式时,它可以工作 - 即工厂方法返回一个自动释放指针,因此self.alertView
有一个值。一旦显示,它就会保留在视图层次结构中。这不是我想要做的事情 - 尽管 - 这是一个错误,当我为发布而构建时它将其作为一个实际问题抬头:编译器(逻辑上)似乎优化了分配,将self.alertView
等同于nil
。
即使我将分析器切换为在我的发布版本上运行,也不会标记这种弱指针的使用。
有没有办法让编译器/预编译器标记这个?
答案 0 :(得分:0)
添加此项以获得您期望的行为......
@autoreleasepool {
self.alertView = [UIAlertView alertViewWithTitle:@"my alert view"];
}
[self.alertView show];
使用ARC时,无法保证您的对象会立即清理。编译器不知道您的工厂方法是否添加了强引用。它可能是。
此answer详细介绍。
静态方法并不总是与alloc init相同。编译器无法区分+(id)makeMyObject和+(id)getMyObjectThatAlreadyExistsAndIsManagedBySomebodyElse。