Имате въпрос относно блокове в object-c. Например имам списък с действия. Инициализирам масив от блокове:
self.actions = @[
^() { [self showObject:self.object_1]; },
^() { [self showObject:self.object_2]; },
^() { [self showObject:self.object_3]; }
];
И извикването им, когато се натисне някакъв ред:
- (void)pressedRowAtIndex:(NSInteger)index {
if (index < actions.count) {
void (^action)() = [actions objectAtIndex:index];
if (action != nil) {
action();
}
}
}
И всичко работи добре без проблем. Но когато стартирам своя масив от действия с помощта на метода initWithObjects
:
self.actions = [NSArray alloc] initWithObjects:
^() { [self showObject:self.object_1]; },
^() { [self showObject:self.object_2]; },
^() { [self showObject:self.object_3]; },
nil
];
След това получавам срив при опит да получа действие по индекс чрез използване на objectAtIndex
метод на NSArray
клас.
Разбирам разликата между тези inits. Първият не увеличава броя на препратките, както прави първият. Но може ли някой да обясни защо се срива?
Редактиране:
Всичко, което намерих. Може би съм луд и някъде другаде има друга полезна информация.
Няма информация за срив в терминала:
Код за Onik IV:
Малък пример:
@interface ViewController () {
NSArray *actions;
}
@property (nonatomic, strong) NSString *object1;
@property (nonatomic, strong) NSString *object2;
@property (nonatomic, strong) NSString *object3;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
actions = [[NSArray alloc] initWithObjects:
^() { [self showObject:self.object1];},
^() { [self showObject:self.object2]; },
^() {[self showObject:self.object3]; },
nil];
}
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
self.object1 = @"object 1";
self.object2 = @"object 2";
self.object3 = @"object 3";
void(^firsSimpleBlock)(void) = [actions lastObject];
firsSimpleBlock();
void(^simpleBlock)(void) = [actions firstObject];
simpleBlock();
}
-(void)showObject:(NSString *)object
{
NSLog(@"Show: %@",object);
}
@end
Continue program execution
няколко пъти, докато изключението се отпечата в изхода. - person Cy-4AH   schedule 03.03.2015