0

我正在为 iOS 7 开发,但我仍然必须手动编写 getter,否则我的属性不会被初始化。我尝试手动合成这些属性,即使不再需要这些属性,但这并没有做到。

在下面的视图控制器中,我使用了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
4

1 回答 1

2

属性/实例变量不会为您神奇地初始化。当你说:

@property (strong, nonatomic) TracksMotion *motionTracker;

...您只是为实例变量保留内存空间(并通过@synthesize或自动合成生成 getter 和 setter 方法)。那里没有实际的 TracksMotion 对象,直到您将一个对象放在那里。你必须编写代码来做到这一点。您必须创建或获取一个 TracksMotion 实例并将其分配给self.motionTracker某个时间点,大概是在生命周期的早期self(在本例中,这是一个 ViewController 实例)。在您运行执行此操作的代码之前,它self.motionTracker是零。

(您可能会感到困惑,因为它看起来像是自动初始化。例如,您有@property (weak, nonatomic) IBOutlet UIButton *startRecording;果然,self.startRecording是一个按钮。但那是因为 nib 加载过程为您所做的正是我正在做的事情说你必须这样做:它从情节提要或 .xib 文件中创建一个按钮,并将其分配给此实例变量。)

于 2014-05-03T02:36:06.603 回答