Nic*_*ick 2 cocoa cocoa-touch objective-c
我无法弄清楚为什么我在这段代码中得到了"发送到不可变对象的变异方法".数组必须以某种方式不可变,但我不知道为什么.
接口:
@interface SectionsViewController : UIViewController<UITableViewDelegate, UITableViewDataSource, UISearchBarDelegate> {
UITableView *table;
UISearchBar *search;
NSMutableDictionary *names;
NSMutableArray *keys;
}
@property (nonatomic, retain) IBOutlet UITableView *table;
@property (nonatomic, retain) IBOutlet UISearchBar *search;
@property (nonatomic, retain) NSDictionary *allNames;
@property (nonatomic, retain) NSMutableDictionary *names;
@property (nonatomic, retain) NSMutableArray *keys;
-(void) resetSearch;
-(void) handleSearchForTerm:(NSString *)searchTerm;
@end
Run Code Online (Sandbox Code Playgroud)
请注意,名称是MutableDictionary.
以下行抛出异常
[array removeObjectsInArray:toRemove];
Run Code Online (Sandbox Code Playgroud)
完整上下文中的方法:
-(void)handleSearchForTerm:(NSString *)searchTerm
{
NSMutableArray *sectionsToRemove = [[NSMutableArray alloc] init];
for(NSString *key in self.keys)
{
NSMutableArray *array = [names valueForKey:key];
NSMutableArray *toRemove = [[NSMutableArray alloc] init];
for(NSString *name in array)
{
if([name rangeOfString:searchTerm
options:NSCaseInsensitiveSearch].location == NSNotFound)
[toRemove addObject:name];
}
if([array count] == [toRemove count])
[sectionsToRemove addObject:key];
[array removeObjectsInArray:toRemove];
[toRemove release];
}
[self.keys removeObjectsInArray:sectionsToRemove];
[sectionsToRemove release];
[table reloadData];
}
Run Code Online (Sandbox Code Playgroud)
我从这个[name valueForKey:key]的结果中分配数组; 数组是'MutableArray'类型我错过了什么?
谢谢!
valueForKey:返回一个NSArray.你把它寄给一个并不重要NSMutableArray.
您可以将结果转换为(NSMutableArray *),但我个人的偏好是获取副本:
NSMutableArray *array = [[[names valueForKey:key] mutableCopy] autorelease];
Run Code Online (Sandbox Code Playgroud)