beautypg.com

Apple Newton Programmer’s Newton 2.0 (for Newton 2.0) User Manual

Page 629

background image

C H A P T E R 1 7

Additional System Services

Using Additional System Services

17-13

The following code example removes all alarms an application has scheduled for
the next five minutes:

foreach alarmKey in GetAppAlarmKeys(":MyApp:MySig") do

if not (GetAlarm(alarmKey).time > Time() + 5) then

RemoveAlarm (alarmKey);

Removing Installed Alarms

17

The functions

RemoveAlarm

and

RemoveAppAlarms

remove a particular alarm

and all of an application’s alarms, respectively. The

RemoveAlarm

function takes

the alarm key of the alarm to remove as its single argument. Use of this function is
demonstrated in the code example in “Retrieving Alarm Keys” beginning on
page 17-12.

The

RemoveAppAlarms

function takes an alarm key suffix as an argument and

removes all alarms whose key ends with this suffix. For this reason it is important
for all alarms created by a particular application to use alarm keys ending with the
same suffix. If your application’s alarm are not meaningful if your application is
not installed, you should call this function in your application’s

RemoveScript

function.

Common Problems With Alarms

17

This section describes common problems encountered with use of the alarm service.

Problems With Alarm Callback Functions

17

Alarms are kept in a soup; thus, they persist across restarts and installation or
removal of packages. This means that the arguments you pass to your callback
function are also stored in a soup; hence, these arguments are also copied deeply.
(See the description of the

DeepClone

function in Newton Programmer’s

Reference.) Therefore, you must avoid indirectly referencing large objects lest
they unnecessarily inflate the size of your entries in the alarm soup.

A classic example of accidentally referencing a large object is in dynamically
creating the function object executed with the alarm. Function objects may contain
references to the lexical environment and the current receiver (

self

) at the time

they are created. For example, function objects created from a view method reference
the root view through their parent chain. If you pass such a function object to the

AddAlarm

function, the system attempts to copy the entire root view into the

alarm soup. One way to minimize the size of your callback function object is to
pass as your callback a one-line function that invokes a method in your application
package to actually do the work.