强制obj-c在访问nil属性时抛出异常

时间:2014-05-07 10:16:53

标签: objective-c lldb

通过创建例如NSMutableArray* myArray属性然后忘记在self.myArray = [NSMutableArray array];中分配-init,我被抓了太多次。我的应用程序当然永远不会在这种情况下抱怨,因为如果[self.myArray addObject:foo]self.myArraynil完全合法,那么我就会抓挠我的头,然后去#34;加倍你的发球EFF"

我意识到这是一个很长的镜头,但是有一个lldb属性或属性说明符会导致obj-c在完成-init后确保属性是非零的吗?

5 个答案:

答案 0 :(得分:1)

我不相信有一个可以帮助您的编译器标志,但是您可以更改数组访问的语义,以便它通过您自己的方法而不是直接转到NSMutableArray

所以而不是

@interface MyClass : NSObject
@property NSMutableArray *array
@end

使用:

@interface MyClass : NSObject
- (void)addObject:(id)object;
- (NSUInteger)objectCount;
- (id)objectAtIndex:(NSUInteger)index;
- (void)removeObjectAtIndex:(NSUInteger)index;
@end

你可以在这些数组访问方法中添加你喜欢的任何检查(当然也可以懒惰地创建数组)。

然而,正如您所看到的,这可能会为解决一个小问题增加大量工作,而我自己也不会这样做:)

答案 1 :(得分:0)

我不知道这样的机制并且不认为它存在,因为它几乎没有实际意义,因为在设计的大部分时间里有许多类的属性为nil

可以使用objc-runtime中的class_copyPropertyList()执行此检查,然后按名称读取每个属性(例如,使用valueForKey:)。在最简单的情况下,您可以在[self logNilProperties]上创建类似NSObject的类别方法,并在要检查的类的init...方法的末尾调用它。

答案 2 :(得分:0)

你想要的是不可能的。这是一种语言功能。你不能只改变语言的行为。

您可以获得的最佳解决方案可能是为您的属性值引入单元测试。或断言:

assert(self.property != nil)

答案 3 :(得分:0)

- (NSMutableArray*) myArray
{
    NSAssert(nil != _myArray);
    return _myArray;
}

您可以编写myArray accessor。

的此实现

你也可以添加你的类方法:

- (void) AssertValid
{
    NSAssert(nil != _myArray);
}

答案 4 :(得分:-1)

这是一小段代码,用于抛出异常。

 NSException *exception=[[NSException alloc]initWithName:@"no result" reason:@"array empty" userInfo:nil];
    [exception raise];

可以在AppDelegate文件中捕获异常

void exceptionHandler(NSException *exception){

}

在此方法之前写

NSSetUncaughtExceptionHandler(&exceptionHandler);
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

中的

快乐编码:)