LLVM不喜欢以关键字“new”开头的Objective-C类方法名称

时间:2017-03-09 19:20:00

标签: objective-c unit-testing llvm

拥有非ARC应用。单元测试目标是从XCode创建的标准XCTest框架,目标 ARC本身,这意味着在单元测试中使用ARC,但所有实际应用程序的代码都是非ARC。这个设置一切都很好。直到...

在应用程序中引入了一个新的类实例方法,如下所示:

- (NSArray *)newThingy
{
  NSArray *arr = [[NSArray new] autorelease];
  // some logic here
  return arr;
}

为此创建了一个单元测试:

MyClass *class1 = [MyClass new];
NSArray *req = [class1 newThingy]; // returns a new object
XCTAssertEqualObjects(myarr[@"somethingtocheck"], @"somevalue");

单元测试本身抛出一个异常,用于释放已经释放的对象。在意识到我有其他类完成同样的事情甚至在测试中完全没问题之后,我在新方法中将它跟踪到这一行:

NSArray *arr = [[NSArray new] autorelease];

删除自动释放可以缓解异常,但AFAIK是符合发布/保留周期规则的正常兼容非ARC逻辑,并且不会导致应用程序本身出现问题。再加上,在应用程序的其他方法中做同样的事情完全没问题。经过研究和尝试,我发现导致异常的是方法本身被命名为 newXXXX,其中XXXX是任何以驼峰为基础的名称,即以“new”之后的大写字母开头。因此命名方法'newThingy'会导致异常,'newSomeOtherThingy'也是如此,但'newthingy'(注意全部小写)会使异常消失!

这是一些我们应该知道的LLVM编译器怪癖吗?它让我想起了我使用的静态库,其中该框架有一个名为'copyData'的方法,并且LLVM静态分析器抱怨它,即使代码没有问题,可能是因为它关闭'copy'关键字并认为它是NSCopying协议复制方法实际上并非如此。我已经吸取了教训,没有用newSomething命名方法,但是我想确保没有一些我一直错过的开发文档。好像LLVM不喜欢名为newSomthingCamelCase的方法,至少在混合使用ARC /非ARC时不是这样吗?

0 个答案:

没有答案