Это лучший способ справиться с этим?
В зависимости от вашего использования, вы можете сохранить это как переменную экземпляра (если вы действительно не хотите, чтобы блок был разделен междуклассы и, таким образом, изменяются для всех классов в любое время, когда вызывается startEvent:
.
Является ли __block объектом NSObject?объявление C?
Это спецификатор хранилища C.
Почему я должен его копировать?Разве нельзя просто сохранить его?
Вы можете сохранить его, но, вероятно, он не будет делать то, что вы хотите, чтобы он делал.В C и Objective-C блоки создаются в стеке.Когда вы копируете его, он (и любые закрытые переменные) копируются в кучу.Если вы сохраните его, он и его переменные не будут скопированы в кучу.
Если это не объект Obj-C, почему я могу вызывать [... copy]
и [... retain]
как бы?
Магия.:) Более серьезно, в Objective-C блоки предназначены для работы в качестве объектов Objective-C.(Это похоже на причину, по которой вы можете плавно приводить значения между NSString
и CFStringRef
- объекты созданы таким образом, чтобы это было возможно.)