Важно понять, что блокировка (m_Hash) делает НЕ , препятствуют тому, чтобы другой код использовал хеш. Это только препятствует тому, чтобы другой код работал, который также использует m_Hash в качестве его объекта блокировки.
Одна причина использовать опцию A состоит в том, потому что классы, вероятно, будут иметь частные переменные, которые Вы будете использовать в операторе блокировки. Намного легче просто использовать один объект, который Вы используете для блокировки доступа ко всем ним вместо того, чтобы пытаться использовать более прекрасные гранулярные блокировки для блокировки доступа только к участникам, в которых Вы будете нуждаться. При попытке пойти с более прекрасным гранулярным методом, необходимо будет, вероятно, взять, несколько привязывают некоторые ситуации, и затем необходимо удостовериться, что Вы всегда берете их в том же порядке избежать мертвых блокировок.
Другая причина использовать опцию A состоит в том, потому что возможно, что ссылка на m_Hash будет доступна вне Вашего класса. Возможно, у Вас есть общественная собственность, которая предоставляет доступ к нему, или возможно Вы объявляете его, как защищено, и производные классы могут использовать его. В любом случае, как только внешний код имеет ссылку на него, возможно, что внешний код будет использовать его для блокировки. Это также открывает возможность мертвых блокировок, так как у Вас нет способа управлять или знать то, что приказывает, чтобы блокировка была принята.
У меня был большой успех с UKCrashReporter . Код прост и легко модифицируется в соответствии с L&F вашего приложения.
PLCrashReporter выглядит интересно.
Я бы не стал использовать Smart Crash Reporter только потому, что многие пользователи (справедливо) этого не делают. оцените, как ваше приложение внедряет код в неожиданные места, и это мне кажется хрупким (возможно, опасным для использования в выпущенном приложении) подходом.
Другие хорошо ответили на вопрос и указали на хороший пример кода.
Самостоятельно написать код довольно просто. Как правило, стратегия такова:
Я видел, как несколько приложений используют Smart Crash Reporter или, возможно, какой-то его вариант. Когда ваше приложение вылетает, оно вызывает обычное диалоговое окно сбоя Apple с дополнительной кнопкой с надписью «Отправить и Apple, и вам»
I've also rolled my own: SFBCrashReporter
There is a small post on my blog about it.
Я бы уклонился от Smart Crash Reporter по той единственной причине, что он не понравится многим пользователям и является хорошим способом получить плохую репутацию в прессе о вашем приложении (заслуженно или нет) PLCrashReporter или UKCrashReporter http://zathras.de/angelweb/sourcecode.htm они дадут некоторые идеи о том, что делать и как это делать способами, которые не внедряются в другое пространство кода.
Другой вариант - Breakpad от Google. Он имеет оболочку фреймворка Cocoa и совместим с сервером Mozilla Socorro . Он используется Firefox, а фреймворк Cocoa используется в текущих бета-версиях Camino.
Я использую ILCrashReporter , и он отлично работает. Этот метод основан на электронной почте, поэтому он хорошо работает с Fogbugz .