如何使用类别抑制目标C分析器警告

时间:2012-03-01 17:43:52

标签: ios warnings categories

我在目标C中使用静态代码分析器,我发现使用类别在多个文件中传播大文件会导致以下问题:

@interface TestClass : UIViewController
@property (nonatomic, assign) UITableView* myTableView;
@end

@implementation TestClass
@end

@interface TestClass (someCategory)
@end

@implementation TestClass (someCategory)
- (void) someMethod
{
    // ...
    CGRect tableViewRect = 
       CGRectMake( sectionRect.origin.x,
                   sectionRect.origin.y + sectionRect.size.height + 1.0,
                   sectionRect.size.width,
                   tableViewHeight);
    myTableView = [[UITableView alloc] initWithFrame:(CGRect) tableViewRect
                             style:(UITableViewStyle) UITableViewStylePlain];
   [self.view addSubView: (UIView*) myTableView];
   [myTableView release];
}
@end

问题#1:编译TestClass(s​​omeCategory)给我一个错误“使用未声明的标识符'theArray'”。 - >添加前缀“self.myTableView”似乎可以解决问题。

问题#2:一旦我添加了“自我”。在“myTableView”之前的前缀,代码分析器抱怨“调用者此时不拥有的对象的引用计数的错误减少” - >我之前在我的代码中看过这个:通过删除“self”很容易解决。在其他非分类类中加前缀。

所以我有一个抓住22的情况! - 如果没有为“self”使用的属性添加前缀,我就不能拥有类别。 - 代码分析器给了我警告,因为它似乎不明白我的类别拥有它分配和释放的对象。

修复这两个问题中的任何一个对我都有用 (a)在引用我的类别实现中的属性时,找到一种避免指定“.self”前缀的方法 (b)找到一种方法让代码分析器对我拥有“self.xxx”这一事实感到满意,其中“xxx”是我正在分类的类的属性。

1 个答案:

答案 0 :(得分:0)

如果您需要在对象的生命周期内保存对表视图的引用,则应使用dealloc方法释放它。说[object release]实际上是说你不再需要对这个对象的引用了。

如果需要对表视图的引用,则不需要使用实例变量/属性。只需在方法中设置一个临时UITableView *指针。

从属性getter中释放对象通常是个坏主意(请参阅此问题:Incorrect decrement of the reference count of an object that is not owned at this point by the caller