2014-05-03 29 views
0

我正在为iOS 7开发,但我仍然必须手动编写getter,否则我的属性不会被初始化。我试图手动合成这些属性,即使不再需要这些属性,但那不行。属性不会在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有方法startsTrackingMotion一个公共的API,所以我不知道为什么这是行不通的。

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

@interface TracksMotion : NSObject 

- (void)startsTrackingMotion; 

- (void)stopTrackingMotion; 

@property (strong, nonatomic) CMMotionManager *motionManager; 

@end 

回答

2

属性/实例变量神奇初始化为您服务。当你说:

@property (strong, nonatomic) TracksMotion *motionTracker; 

...你只是保留内存空间的实例变量(通过@synthesize或autosynthesis生成getter和setter方法)。在那里没有实际的TracksMotion对象,直到你在那里放置一个。你必须编写代码来做到这一点。您必须创建或获得一个TracksMotion实例,并将其分配给self.motionTracker,大概在self(在这种情况下,这是一个ViewController实例)的早期阶段。在你运行代码之前,self.motionTracker是零。

(这可能是你被迷惑,因为它看起来像网点自动初始化。例如,你有@property (weak, nonatomic) IBOutlet UIButton *startRecording;果然,self.startRecording是一个按钮,但是那是因为笔尖加载过程不对你而言,我说你必须做的事情是:从故事板或.xib文件创建一个按钮,并将它分配给这个实例变量。)

+0

基本上,做self.motionTracker = [[TrackerMotion alloc] init ]。我认为这甚至不是必需的,我认为该属性会在需要时创建,只需使用self.property即可。谢谢! –

+1

@BillCapelli除非这不是指定的初始值设定项。 – matt