2014-05-03 30 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