2013-09-17 2 views
0

Я борюсь с синтаксисом блоков. Мне нужен блок, который не принимает никаких параметров и возвращает строку, и мне нужно сохранить этот блок в свойстве. До сих пор, это то, что у меня есть ...Как создать и сохранить в свойстве блок, который возвращает строку?

Заявляю это свойство:

@property (nonatomic, copy) NSString * (^myBlockThatReturnsAString)(); 

поручаю блок, как это:

someObject.myBlockThatReturnsAString = ^NSString *() { 
    return @"foo"; 
}; 

Это все компилируется нормально.

Я пытаюсь использовать его как это:

myString = someObject.myBlockThatReturnsAString; 

, но я получаю

-[__NSMallocBlock__ isEqualToString:]: unrecognized selector sent to instance 0xc16b3b0 

Где я буду неправильно?

+0

Я предпочитаю понимать это: http://nilsou.com/blog/2013/08/21/objective-c-blocks-syntax/ –

+0

@Abizern Это удобно, но, похоже, это всего лишь объявление блоков. Согласно этой странице я правильно заявлял свойство, но я все еще не понимаю, где я поступил неправильно. –

ответ

2

Неправильно то, что вы пытаетесь запустить блок, фактически не запускаете его, он просто возвращает объект блока и пытается присвоить его переменной NSString.

Это должно работать:

myString = someObject.myBlockThatReturnsAString();

Вот great article о понимании синтаксиса блока и почему это так оно и есть.

+0

Спасибо Бенуа за объяснение. Это имеет смысл. Однако, когда я добавляю круглые скобки, я получаю EXC_BAD_ACCESS (код = 2, адрес = 0xc). Итак, может быть, новый вопрос заключается в том, как выполнить блок, хранящийся в свойстве, когда блок не принимает никаких параметров? –

+0

Как вы назначили блок свойству? Кроме того, вы используете ARC? –

+0

Да, ARC (Xcode 5, iOS7, такое же поведение в iOS6). Назначение, как указано выше. –

Смежные вопросы