С помощью swizzling «helper» методов, включенных в ConciseKit , вы фактически вызываете реализацию по умолчанию ... достаточно странно .. путем вызова вашей реализации SWIZZLED ..
Вы установили его в + (void) load
, вызвав + (BOOL)swizzleMethod:(SEL)originalSelector with:(SEL)anotherSelector in:(Class)klass;
, то есть
[$ swizzleMethod:@selector(oldTired:)
with:@selector(swizzledHotness:) in:self.class];
, а затем в swizzled method .. давайте предположим, что он возвращает -(id)
.. вы можете сделать свое зло , или по какой-либо причине вы в первую очередь задираете ... а затем вместо возвращения объекта или self
или еще чего ...
return [self swizzledHotness:yourSwizzledMethodsArgument];
В этом методе похоже, что мы снова вызываем тот же метод, вызываем и бесконечную рекурсию. Но к тому времени, когда эта линия будет достигнута, оба метода были заменены. Поэтому, когда мы вызываем swizzled_synchronize, мы на самом деле вызываем оригинальный метод.
blockquote>Он чувствует и выглядит странно, но .. он работает. Это позволяет добавлять бесконечные приукрашивания к существующим методам и по-прежнему «называть супер» (фактически «я») и использовать преимущества ручной работы оригинального метода ... даже без доступа к исходному источнику.
Пример использования ShellExecute ()
:
procedure TForm1.Button1Click(Sender: TObject);
begin
ShellExecute(0, nil, 'cmd.exe', '/C find "320" in.txt > out.txt', nil, SW_HIDE);
Sleep(1000);
Memo1.Lines.LoadFromFile('out.txt');
end;
Обратите внимание, что использование CreateProcess ()
вместо ShellExecute ()
позволяет для лучшего контроля над процессом.
В идеале вы также должны вызвать это во вторичном потоке и вызвать WaitForSingleObject ()
на дескрипторе процесса, чтобы дождаться завершения процесса. Sleep ()
в этом примере - это просто способ подождать некоторое время, пока программа, запущенная ShellExecute ()
, завершится - ShellExecute ()
не будет работать который. В противном случае вы не могли бы, например, просто открыть экземпляр блокнота
для редактирования файла, ShellExecute ()
заблокировала бы ваше родительское приложение до тех пор, пока редактор не будет закрыт.