2013-04-18 83 views
-1

我工作corelocation和又寫道這個代碼需要幫助就@property概念

CLLocationManager *locationManager = [[CLLocationManager alloc]init]; 
    [locationManager setDesiredAccuracy:kCLLocationAccuracyBestForNavigation]; 
    [locationManager setDelegate:self]; 
    //[locationManager setDistanceFilter:0.0f]; 
    [locationManager startUpdatingLocation]; 


-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations { 
    . 
    . 
    . 
} 

,但我的委託方法是行不通的,經過15 - 20,我意識到,我並沒有創造CLLocationManager @property (strong, nonatomic) CLLocationManager *locationManager;的財產

做完這一切後,一切正常,沒有問題。我經歷過這幾次,有些時候事情沒有創建@property工作,有時候,如果沒有創建@property,事情絕對不行。

我知道@property @synthesize創建getter setter,它自動包含防止對象立即銷燬的內存管理,但有時代碼如何工作而不創建@property

編輯:

我創建一個新的類名MyClass

Myclass.h:

@interface MyClass : NSObject 
-(void)giveMeOk; 
@end 

MyClass.m

@implementation MyClass 

-(void)giveMeOk { 
    NSLog(@"Its Ok."); 
} 

@end 

在我的視圖控制器在哪裏在i中寫了corelocation代碼TS viewdidload我這樣做:

. 
. 
. 
MyClass *myClassObj = [[MyClass alloc]init]; 

    [myClassObj giveMeOk]; 
. 
. 
. 

,並在控制檯Its Ok.打印成功,所以它的工作沒有@property

+0

我不unserstand。你說你通過創建一個屬性來解決你的問題。你的代碼不會顯示一個屬性,而是一個局部變量。請說明你的問題,它很難回答這樣的問題。謝謝。另外,你使用的是ARC嗎? – katzenhut

+0

屬性不需要編寫Objective-C代碼。實際上,它們只不過是自動生成的方法和變量。 – borrrden

+0

請定義你的意思是「不要工作」。你期望什麼樣的行爲?你取得了什麼結果? –

回答

1

我認爲您可能遇到的問題是當您不使用本地變量「創建屬性」時。區別在於,一旦變量的作用域已經結束(通常是創建方法的結束),它將被釋放,因此不會調用位置管理器之類的委託方法(因爲不再需要調用某個對象他們,即使您的代理仍然存在)

通過創建你增加的對象屬性保留計數,確保對象的生命持續的時間超過它在

更新創建的方法:

你更新讓我覺得我是對的。問題是你不理解對象的生命週期:一個局部變量只存在於它的創建範圍內(例如:在運行viewDidLoad之後,myClassObj不再存在)。對於需要在該方法之後繼續工作的內容(即基本上只是輪詢硬件GPS的位置管理器),您需要一個屬性,因爲它需要保留足夠長的時間才能完成其工作。對於立即執行其工作的東西(例如您的示例類,它只執行日誌並返回,即沒有異步)本地變量很好

+0

請再次查看我的問題我更新它。 –

+2

該更新讓我覺得我是對的。問題是你不瞭解對象的生命週期。一個局部變量只存在於其創建的範圍內,對於需要繼續在該方法之後工作的事物(即位置管理器),您需要一個屬性。對於立即執行其工作的東西(例如您的示例類),局部變量很好 – wattson12

+0

非常感謝.....我的概念現在非常清晰。 –

0

正如你所說,一個屬性會生成一個getter和setter方法並管理你的內存。你沒有說的是它創建了一個實例變量。這就是讓你的代碼工作,因爲它保留你的位置管理器的實例(否則它被釋放 - 假設你正在使用ARC)。

當你說'有時它有效',你需要舉例。但是,這隻能意味着某些其他類正在保留您創建的實例...

+0

請再次查看我的問題我更新它。上面的 –

+0

@ wattson12答案完美地描述了你的情況。 – Wain

0

您正在混合實例變量的屬性。只有當你想從外部訪問一個屬性時才需要屬性。調用者甚至不關心該屬性是否對應於一個實例變量,或者哪個屬性對應於一個實例變量,儘管存在一個insance變量是相當普遍的,並且在很多情況下,當屬性(和之前的屬性)被稱爲_abc或abc時)被稱爲abc。如果你不合成它,那麼實例變量_abc被重新賦值相同的類型。

它是保存實際數據的實例變量。

當你不需要從外部訪問它時,你可以聲明一個沒有屬性的實例變量。 由於屬性非常方便,您可以選擇聲明一個屬性,但在* .m文件中。

你做什麼有點危險。當你聲明一個屬性locationManager,然後在一個方法或一個if塊或for循環中或本地聲明CLLocationManager *locationManager然後你處理一個同名的局部變量。這是完全合法的,但可能會導致錯誤。在當地locationManager的範圍之外,仍然有可用的財產。但是,它可以訪問同一類型和名稱的另一個對象!