通过创建例如NSMutableArray* myArray
属性然后忘记在self.myArray = [NSMutableArray array];
中分配-init
,我被抓了太多次。我的应用程序当然永远不会在这种情况下抱怨,因为如果[self.myArray addObject:foo]
是self.myArray
,nil
完全合法,那么我就会抓挠我的头,然后去#34;加倍你的发球EFF"
我意识到这是一个很长的镜头,但是有一个lldb属性或属性说明符会导致obj-c在完成-init
后确保属性是非零的吗?
答案 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
中的
快乐编码:)