我可以强制对弱参数的赋值发出警告吗?

时间:2014-05-27 17:36:43

标签: objective-c compiler-warnings weak-references autorelease

我看到了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

即使我将分析器切换为在我的发布版本上运行,也不会标记这种弱指针的使用。

有没有办法让编译器/预编译器标记这个?

1 个答案:

答案 0 :(得分:0)

添加此项以获得您期望的行为......

@autoreleasepool {
    self.alertView = [UIAlertView alertViewWithTitle:@"my alert view"];
}
[self.alertView show];

使用ARC时,无法保证您的对象会立即清理。编译器不知道您的工厂方法是否添加了强引用。它可能是。

answer详细介绍。

静态方法并不总是与alloc init相同。编译器无法区分+(id)makeMyObject和+(id)getMyObjectThatAlreadyExistsAndIsManagedBySomebodyElse。