Ios 如何使用类别抑制客观C分析仪警告

Ios 如何使用类别抑制客观C分析仪警告,ios,warnings,categories,Ios,Warnings,Categories,我在objective C中使用静态代码分析器,我发现使用类别在多个文件中传播一个大文件会导致以下问题: @interface TestClass : UIViewController @property (nonatomic, assign) UITableView* myTableView; @end @implementation TestClass @end @interface TestClass (someCategory) @end @implementation TestC

我在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”之前添加了“self.”前缀,代码分析器就会抱怨“调用方此时不拥有的对象的引用计数减少不正确” ->我以前在代码中看到过这一点:在其他未分类的类中删除“self.”前缀很容易修复

所以我遇到了第22条困境! -如果不在我使用的属性前面加上“self”,我就不能拥有一个类类别 -代码分析器向我发出警告,因为它似乎不理解我的类别拥有它分配和释放的对象

解决这两个问题中的任何一个对我都有效 (a) 在引用my category实现中的属性时,找到避免指定“.self”前缀的方法
(b) 我拥有“self.xxx”,其中“xxx”是我正在分类的类的一个属性。如果您需要在对象的生命周期中保留对表视图的引用,则应在
dealloc
方法中释放它。说
[objectrelease]
实际上就是说您不再需要对该对象的引用

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


从属性getter中释放对象通常是一个坏主意(请参见此问题:)

如果要初始化表视图,将其添加到视图中,然后释放它,为什么要保留实例变量中的引用?myTableView的范围是viewController的范围。来自网络的外部事件可能会导致我的TableViewController更新myTableView,因此我需要访问该变量。(当我关闭viewController时,直到父视图被释放,发布才会生效)我在TestClassic的dealloc方法中释放它。在这种情况下,您真的不应该在
someMethod
实现中释放它。该属性具有
assign
特性,因此您将双重释放。我将在TestClass的dealloc方法中释放它!当我从Testclass(someCategory)分配时,代码分析器会抱怨。删除[self.myTableView版本];在[self.view addSubView:(UIView*)myTableView]之后;不纠正代码分析器警告。我在代码的其他地方看到过类似的情况,在不使用类别的类中,从属性中删除“self”。前缀会消除警告。分析器具体抱怨哪一行?代码分析器说“调用方此时不拥有的对象的引用计数的错误递减”。这就是我调用[self.myTableView release];。注意,我在一个“常规”类上看到了100个该警告的实例(与这里的情况相反)。在常规类中,将[release self.propertyName]替换为[release propertyName]可以消除警告。似乎代码分析器正在将“self”作为常规指针处理,而没有认识到“self.propertyName”和“propertyName”的等价性