【问题标题】:How to suppress objective C analyser warning with categories如何使用类别抑制客观 C 分析器警告
【发布时间】:2012-03-01 17:43:51
【问题描述】:

我在objective 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”之前的前缀,代码分析器抱怨“调用者此时不拥有的对象的引用计数减少错误” ->我以前在我的代码中看到过这个:通过删除“自我”很容易修复。其他非分类类中的前缀。

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

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

【问题讨论】:

  • 如果你正在初始化一个表视图,将它添加到视图中,然后释放它,你为什么要保留实例变量中的引用?
  • myTableView 的作用域是viewController 的作用域。来自网络的外部事件可能会导致我的 TableViewController 更新 myTableView,因此我需要访问该变量。 (当我关闭我的viewController时,直到父视图被释放,释放才会生效)

标签: ios warnings categories


【解决方案1】:

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

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

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

【讨论】:

  • 我在TestClass的dealloc方法中发布
  • 在这种情况下,你真的不应该在你的someMethod 实现中发布它。该属性具有assign 特征,因此您将进行双重释放。
  • 我在TestClass的dealloc方法中发布!当我从 Testclass (someCategory) 分配时,代码分析器会抱怨。删除 [self.myTableView 版本]; [self.view addSubView: (UIView*) myTableView];不纠正代码分析器警告。我在我的代码中的其他地方看到过类似的东西,在不使用类别的类中,并删除了“自我”。属性中的前缀确实可以消除警告。
  • 分析仪到底在抱怨哪一行?
  • 代码分析器说“调用者此时不拥有的对象的引用计数减少错误”。这就是我调用 [self.myTableView release]; 的地方。请注意,我在“常规”类(而不是此处的类别)上看到了 100 个此警告的实例。在常规课程中,将 [release self.propertyName] 替换为 [release propertyName] 可以消除警告。似乎代码分析器将“self”作为常规指针处理,而不是识别“self.propertyName”和“propertyName”的等价性
猜你喜欢
  • 1970-01-01
  • 2011-06-24
  • 1970-01-01
  • 2021-02-08
  • 1970-01-01
  • 2018-07-11
  • 2011-08-13
  • 2019-02-25
  • 2011-03-18
相关资源
最近更新 更多