Свойства не инициализируются в iOS 7

Я разрабатываю для iOS 7, но мне все еще приходится писать геттеры вручную, иначе мои свойства просто не инициализируются. Я пытался вручную синтезировать эти свойства, хотя это больше не нужно, но это не помогает.

В моем представлении контроллера ниже, я использую свойство motionTracker, который никогда не инициализируется. У меня та же проблема со всеми моими проектами, поэтому я знаю, что это недоразумение с моей стороны.

#import "ViewController.h"
#import "TracksMotion.h"

@interface ViewController ()

@property (weak, nonatomic) IBOutlet UIButton *startRecording;
@property (weak, nonatomic) IBOutlet UIButton *stopRecording;

@property (strong, nonatomic) TracksMotion *motionTracker;
@end

@implementation ViewController

@synthesize motionTracker = _motionTracker;

- (void)startMyMotionDetect
{
    [self.motionTracker startsTrackingMotion];
}

@end

motionTracker имеет публичный API для метода startsTrackingMotion поэтому я не знаю, почему это не работает.

#import <Foundation/Foundation.h>
#import <CoreMotion/CoreMotion.h>

@interface TracksMotion : NSObject

- (void)startsTrackingMotion;

- (void)stopTrackingMotion;

@property (strong, nonatomic) CMMotionManager *motionManager;

@end

1 ответ

Решение

Свойства / переменные экземпляра магически не инициализированы для вас. Когда ты сказал:

@property (strong, nonatomic) TracksMotion *motionTracker;

... вы просто резервируете пространство памяти для переменной экземпляра (и генерируете метод получения и установки через @synthesize или автосинтез). Там нет реального объекта TracksMotion, пока вы не поместите его туда. Вы должны написать код, чтобы сделать это. Вы должны создать или получить экземпляр TracksMotion и назначить его self.motionTracker в какой-то момент, предположительно в начале жизни self (в данном случае это экземпляр ViewController). Пока вы не запустите код, который делает это, self.motionTracker ноль

(Возможно, вы запутались, потому что похоже, что розетки автоматически инициализируются. Например, у вас есть @property (weak, nonatomic) IBOutlet UIButton *startRecording; И конечно же, self.startRecording это кнопка. Но это потому, что процесс загрузки пера делает для вас именно то, что я вам говорю: он делает кнопку из раскадровки или файла.xib и назначает ее этой переменной экземпляра.)

Другие вопросы по тегам