У вас есть вопрос о блоках в Objective-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