Свойства не инициализируются в 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 и назначает ее этой переменной экземпляра.)