我的目标C代码中有一个奇怪的问题。我正在开发一个iPhone应用程序(iOS 7及更高版本)。
我有一个定义如下的函数
@interface SomeClassName : NSObject
@property (nonatomic, strong) NSMutableArray *someArray;
@implementation SomeClassName
@synthesize someArray;
- (void) removeFromSomething:(NSIndexPath *)indexPath {
NSMutableArray *sectionArray = [self.someArray objectAtIndex:indexPath.section];
[sectionArray removeObjectAtIndex:indexPath.row];
if (((int)[sectionArray count]) == 0) {
[self.someArray removeObjectAtIndex:indexPath.section];
}
}
变量sectionArray总是返回Nil
,即使self.someArray有元素,indexPath.section指向self.someArray中的元素。
当我这样做时,这神奇地起作用了。
@interface SomeClassName : NSObject
@property (nonatomic, strong) NSMutableArray *someArray;
@implementation SomeClassName
@synthesize someArray;
NSMutableArray *sectionArray;
- (void) removeFromSomething:(NSIndexPath *)indexPath {
sectionArray = [self.someArray objectAtIndex:indexPath.section];
[sectionArray removeObjectAtIndex:indexPath.row];
if (((int)[sectionArray count]) == 0) {
[self.someArray removeObjectAtIndex:indexPath.section];
}
}
直到现在才发生这种情况(我的项目已经完成,我也在设备中进行了测试)。这个问题最近出现了,不仅在这个函数中,这在整个应用程序中都会发生,从而导致不正确的行为。
我是iOS开发的新手,这是我计划在AppStore中发布的第一个应用程序。知道出了什么问题或者我做错了什么?
答案 0 :(得分:0)
问题可能是你混淆了NSArray
和NSMutableArray
。 indexPath.section
处的元素很可能是一个普通数组,而不是一个可变数组。虽然保存数组的数组可以是可变的,但是如果您明确地使用它们,那么数组元素只是可变的。
因此,您将数组分配给可变数组变量。编译器不会抱怨,因为可变数组是数组的子类。我认为,无论如何,可变数组变量将保持不可变数组的保证行为。也许这就是你获得nil
的原因。
在任何情况下,当您尝试从非可变数组中删除内容时(即使将其放入类型为NSMutableArray
的变量中),它肯定无效。
从数组创建可变数组的方法是
NSMutableArray *mutable = [NSMutableArray arrayWithArray:nonMutableArray];
或
NSMutableArray *mutable = nonMutableArray.mutableCopy;
您必须将修改后的数组复制回数组(同样作为非可变版本)。