Возвращение nil в init в коде Objective C

В случае, если мы вернем nil в методе init, что происходит с сохранением счетчика и кто собирается освободить этот объект?

Как я понимаю, как только мы вызвали alloc (что произойдет до инициализации), счетчик сохранения станет 1. Теперь вызывается init и, допустим, по какой-то причине он не может инициализировать объект, поэтому возвращает nil. .

И похоже, что теперь у нас есть объект со счетчиком сохранения, равным 1, и никто не имеет ссылки на него для вызова освобождения. Я использую геокодер ...

Через несколько дней, чтобы узнать, как работает Android, я решил создать свое первое приложение: простое приложение, которое отображает GMap с адреса, предоставленного пользователем с помощью простого EditText виджет.
Для этого я использую Geocoder .

После небольшого отслеживания ошибок с помощью logcat, вот исключение, возвращаемое adb:

E/LocationMasfClient(   53): forwardGeocode(): RPC failed with status 1
W/System.err(  262): java.io.IOException: RPC failed with status 1
W/System.err(  262):    at   android.location.Geocoder.getFromLocationName(Geocoder.java:166)
W/System.err(  262):    at fr.meetopia.tinymap.MapViewActivity.testGeoCoder(MapViewActivity.java:104)
W/System.err(  262):    at fr.meetopia.tinymap.MapViewActivity.onCreate(MapViewActivity.java:38)
W/System.err(  262):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
W/System.err(  262):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)
W/System.err(  262):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)
W/System.err(  262):    at android.app.ActivityThread.access$2200(ActivityThread.java:119)
W/System.err(  262):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)

А теперь код, на который указывает трассировка стека:

Geocoder geoCoder = new Geocoder(this);
MapView mapView = (MapView) findViewById(R.id.mapview);
    MapController mc = mapView.getController();
    GeoPoint p;
    try {
        List<Address> addresses = geoCoder.getFromLocationName("paris france", 50);
        if (addresses.size() > 0) {
            p = new GeoPoint(
                    (int) (addresses.get(0).getLatitude() * 1E6), 
                    (int) (addresses.get(0).getLongitude() * 1E6));
            mc.animateTo(p);    
            mapView.invalidate();
        }
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

Очевидно , этот код является частью экземпляра MapActivity .

Я провел несколько тестов с разными версиями Google APIS (8, 7, 4) и разными версиями Платформа SDK (2.2, 2.1, 1.6), но не повезло. Я только что заметил, что Google API 8 содержит известную ошибку и возвратил исключение недоступности службы вместо RPC Failed 1 .

С другой стороны, я попытался запустить свое приложение прямо на моем устройстве (HTC Desire 2.1), и я заметил такое же поведение (то есть: отсутствие поведения, карта с США в центре).

А вот и пользовательское разрешение манифеста Android:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />
26
задан Michael Currie 31 August 2015 в 23:52
поделиться