【发布时间】: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(someCategory)给我一个错误“使用未声明的标识符'theArray'”。 -> 添加前缀“self.myTableView”似乎可以解决问题。
问题 2:一旦我添加了“自我”。 “myTableView”之前的前缀,代码分析器抱怨“调用者此时不拥有的对象的引用计数减少错误” ->我以前在我的代码中看到过这个:通过删除“自我”很容易修复。其他非分类类中的前缀。
所以我遇到了第 22 条问题! - 如果没有在我使用的属性前加上“self”前缀,我就不能拥有一个类类别。 - 代码分析器给了我警告,因为它似乎不明白我的类别拥有一个它分配和释放的对象。
解决这两个问题中的任何一个都对我有用 (a) 找到一种方法来避免在从我的类别实现中引用属性时指定“.self”前缀 (b) 找到一种方法让代码分析器对我拥有“self.xxx”这一事实感到满意,其中“xxx”是我正在分类的类的属性。
【问题讨论】:
-
如果你正在初始化一个表视图,将它添加到视图中,然后释放它,你为什么要保留实例变量中的引用?
-
myTableView 的作用域是viewController 的作用域。来自网络的外部事件可能会导致我的 TableViewController 更新 myTableView,因此我需要访问该变量。 (当我关闭我的viewController时,直到父视图被释放,释放才会生效)
标签: ios warnings categories