В Java все переменные, которые вы объявляете, на самом деле являются «ссылками» на объекты (или примитивы), а не самими объектами.
При попытке выполнить один метод объекта , ссылка просит живой объект выполнить этот метод. Но если ссылка ссылается на NULL (ничего, нуль, void, nada), то нет способа, которым метод будет выполнен. Тогда runtime сообщит вам об этом, выбросив исключение NullPointerException.
Ваша ссылка «указывает» на нуль, таким образом, «Null -> Pointer».
Объект живет в памяти виртуальной машины пространство и единственный способ доступа к нему - использовать ссылки this
. Возьмем этот пример:
public class Some {
private int id;
public int getId(){
return this.id;
}
public setId( int newId ) {
this.id = newId;
}
}
И в другом месте вашего кода:
Some reference = new Some(); // Point to a new object of type Some()
Some otherReference = null; // Initiallly this points to NULL
reference.setId( 1 ); // Execute setId method, now private var id is 1
System.out.println( reference.getId() ); // Prints 1 to the console
otherReference = reference // Now they both point to the only object.
reference = null; // "reference" now point to null.
// But "otherReference" still point to the "real" object so this print 1 too...
System.out.println( otherReference.getId() );
// Guess what will happen
System.out.println( reference.getId() ); // :S Throws NullPointerException because "reference" is pointing to NULL remember...
Это важно знать - когда больше нет ссылок на объект (в пример выше, когда reference
и otherReference
оба указывают на null), тогда объект «недоступен». Мы не можем работать с ним, поэтому этот объект готов к сбору мусора, и в какой-то момент VM освободит память, используемую этим объектом, и выделит другую.
After lots of research, I've come up with this answer, and I'm hereby putting it here as an answer for my own question, for reference:
Make sure that "Enable access for assistive devices" is checked in System Preferences>>Universal Access. It is required for the AppleScript to work. You may have to reboot after this change (it doesn't work otherwise on Mac OS X Server 10.4).
Create a R/W DMG. It must be larger than the result will be. In this example, the bash variable "size" contains the size in Kb and the contents of the folder in the "source" bash variable will be copied into the DMG:
hdiutil create -srcfolder "${source}" -volname "${title}" -fs HFS+ \
-fsargs "-cc = 64, a = 16, e = 16" -format UDRW -size $ {size} k pack.temp.dmg
Смонтируйте образ диска и сохраните имя устройства (вы можете захотеть перейти в спящий режим на несколько секунд после этой операции):
device = $ (hdiutil attach -readwrite -noverify -noautoopen "pack.temp.dmg "| \
egrep '^ / dev /' | sed 1q | awk '{print $ 1}')
Сохраните фоновое изображение (в формате PNG) в папке с именем «.background» в DMG и сохраните его имя в переменной «backgroundPictureName».
Используйте AppleScript для установки визуальных стилей (имя .app должно быть в переменной bash «applicationName», при необходимости используйте переменные для других свойств):
echo '
сообщить приложению "Finder"
сказать диску "$ {title}"
открыто
установить текущий вид окна контейнера на вид значков
set toolbar visible of container window to false
set statusbar visible of container window to false
set the bounds of container window to {400, 100, 885, 430}
set theViewOptions to the icon view options of container window
set arrangement of theViewOptions to not arranged
set icon size of theViewOptions to 72
set background picture of theViewOptions to file ".background:'${backgroundPictureName}'"
make new alias file at container window to POSIX file "/Applications" with properties {name:"Applications"}
set position of item "'${applicationName}'" of container window to {100, 100}
set position of item "Applications" of container window to {375, 100}
update without registering applications
delay 5
close
end tell
end tell
' | osascript
Finialize the DMG by setting permissions properly, compressing and releasing it:
chmod -Rf go-w /Volumes/"${title}"
sync
sync
hdiutil detach ${device}
hdiutil convert "/pack.temp.dmg" -format UDZO -imagekey zlib-level=9 -o "${finalDMGName}"
rm -f /pack.temp.dmg
On Snow Leopard, the above applescript will not set the icon position correctly - it seems to be a Snow Leopard bug. One workaround is to simply call close/open after setting the icons, i.e.:
..
set position of item "'${applicationName}'" of container window to {100, 100}
set position of item "Applications" of container window to {375, 100}
close
open
Для тех из Вас, которые интересуются этой темой, я должен упомянуть, как я создаю DMG:
hdiutil create XXX.dmg -volname "YYY" -fs HFS+ -srcfolder "ZZZ"
, где
XXX == disk image file name (duh!)
YYY == window title displayed when DMG is opened
ZZZ == Path to a folder containing the files that will be copied into the DMG
Не идите туда. Как долгосрочный разработчик Mac, я могу уверить Вас, никакое решение действительно не работает хорошо. Я попробовал столько решений, но они - все не слишком хорошие. Я думаю, что проблема состоит в том, что Apple действительно не документирует формат метаданных для необходимых данных.
Вот то, как я делаю его в течение долгого времени, очень успешно:
Создают новый DMG, writeable(!), достаточно большой для содержания ожидаемых двоичных и дополнительных файлов как readme (редкий мог бы работать).
Монтируют DMG и дают его, расположение вручную в Средстве поиска или с любыми инструментами подходит Вам для того, чтобы сделать это (см., что FileStorm связывается в нижней части для хорошего инструмента). Фоновое изображение обычно является изображением, которое мы помещаем в скрытую папку (" .something") на DMG. Поместите копию своего приложения там (любая версия, даже устаревший сделает). Скопируйте другие файлы (псевдонимы, readme, и т.д.) Вы хотите там, снова, устаревшие версии сделают очень хорошо. Удостоверьтесь, что значки имеют правильные размеры и положения (IOW, расположение DMG путем, Вы хотите, чтобы он был).
Размонтирование DMG снова, все настройки должны быть сохранены к настоящему времени.
Запись создавание сценария DMG, который работает следующим образом:
Этот метод не может звучать оптимальным, но доверять мне, он работает действительно хорошо на практике. Можно поместить исходный DMG (шаблон DMG) даже при управлении версиями (например, SVN), поэтому если Вы когда-нибудь случайно изменяетесь/уничтожаете его, можно просто вернуться к пересмотру, где это было все еще хорошо. Можно добавить шаблон DMG к проекту XCode, вместе со всеми другими файлами, которые принадлежат на DMG (readme, файл URL, фоновое изображение), все при управлении версиями и затем создают цель (например, внешняя цель, названная ", Создают DMG"), и там выполните сценарий DMG вышеупомянутых и добавьте старую основную цель как зависимую цель. Можно получить доступ к файлам в дереве XCode использование $ {SRCROOT} в сценарии (всегда исходный корень продукта), и можно получить доступ к продуктам сборки при помощи $ {BUILT_PRODUCTS_DIR} (всегда каталог, где XCode создает результаты сборки).
Результат: На самом деле XCode может произвести DMG в конце сборки. DMG, который готов выпустить. Не только можно создать повторно генерирование DMG, довольно легкого тот путь, можно на самом деле сделать так в автоматизированном процессе (на бездисплейном сервере, если Вам нравится), с помощью xcodebuild из командной строки (автоматизировал ночные сборки, например).
Относительно начального расположения шаблона, FileStorm является хорошим инструментом для того, чтобы сделать его. Это является коммерческим, но очень мощным и простым в использовании. Нормальная версия составляет меньше чем 20$, таким образом, это действительно доступно. Возможно, можно автоматизировать FileStorm для создания DMG (например, через AppleScript), никогда не пробовал это, но как только Вы нашли идеальный шаблон DMG, действительно легко обновить его для каждого выпуска.
Существует немного сценария Bash, названного , создают-dmg , который создает необычный DMGs с пользовательскими фонами, расположением пользовательского значка и именем тома.
я создал его много лет назад для компании, которую я выполнил в то время; это выживает на вкладе других людей с тех пор и по сообщениям работает хорошо.
существует также узел-appdmg , который похож на более современное и активное усилие на основе Node.js; проверьте его также.
.DS_Store файлы хранят настройки Windows на Mac. Настройки Windows включают расположение значков, фон окна, размер окна и т. Д. Файл .DS_Store необходим при создании окна для подключенных изображений, чтобы сохранить расположение файлов и фон окна.
Создав файл .DS_Store, вы можете просто скопировать его в созданный установщик (DMG).
Мое приложение DropDMG - это простой способ создавать образы дисков с фоновыми изображениями, макетами значков, настраиваемыми значками тома и лицензионными соглашениями на программное обеспечение. Им можно управлять из системы сборки с помощью инструмента командной строки dropdmg или AppleScript. При желании RTF-файлы изображений и лицензий могут быть сохранены в вашей системе контроля версий.