Почему мои указатели Макруби не выживают, и они считаются пустыми указателями? - PullRequest
3 голосов
/ 26 июля 2011

Я реализовал селектор alertDidEnd:returnCode:contextInfo:.Последний параметр contextInfo является пустым указателем.Перед вызовом метода я собираю указатель следующим образом.

# in windowShouldClose
p = Pointer.new(:boolean)
p.assign(true)

Затем я вызываю метод, и внутри его тела появляется следующее:

# in alertDidEnd
puts p[0] # => a number like 245
puts p.cast!('B')[0] # => false (rather than true)

Что я делаю неправильно?Это потому, что вызывающий метод (windowShouldClose) завершает свою работу в собственном потоке до того, как у этого селектора появится шанс (только предположения)?

Или я должен создать указатель как указатель на объект?

# make a pointer to an object and assign to it the instance of TrueClass
p = Pointer.new(:id)
p.assign(true)

Я читал, что O'reilly Macruby Book говорит по этому поводу.

Спасибо!

1 Ответ

2 голосов
/ 27 июля 2011

Наиболее вероятная причина в том, что ничто не удерживает этот объект, поэтому он получает мусор.Если вы создадите объект и реализуете его метод finalize и поместите туда putts, вы увидите, что это так.

Попробуйте отследить свое состояние в контроллере, который создает лист, и передатьуказатель на контроллер как contextInfo.Если это состояние опосредует одновременные взаимодействия между элементами пользовательского интерфейса, скорее всего, контроллер, который отвечает за все элементы, должен все равно его отслеживать.Конечно, тогда, вероятно, будет проще не передавать contextInfo и использовать обратный вызов, который вы дадите листу, чтобы отслеживать, в каких условиях он вызывался.

...