我在目标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”之前的前缀,代码分析器抱怨“调用者此时不拥有的对象的引用计数的错误减少” - >我之前在我的代码中看过这个:通过删除“self”很容易解决。在其他非分类类中加前缀。
所以我有一个抓住22的情况! - 如果没有为“self”使用的属性添加前缀,我就不能拥有类别。 - 代码分析器给了我警告,因为它似乎不明白我的类别拥有它分配和释放的对象。
修复这两个问题中的任何一个对我都有用 (a)在引用我的类别实现中的属性时,找到一种避免指定“.self”前缀的方法 (b)找到一种方法让代码分析器对我拥有“self.xxx”这一事实感到满意,其中“xxx”是我正在分类的类的属性。
答案 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)