2012-02-25 21 views
0

this tutorial,筆者有以下聲明:在代碼中的一些點iPhone - 性能,高德等

上.H

UIViewController *presentingViewController; 
... 

@property (retain) UIViewController *presentingViewController; 

上的.m

@synthesize presentingViewController; 

區塊內,他確實:

self.presentingViewController = viewController; 

然後

[presentingViewController dismissModalViewControllerAnimated:NO]; 

我覺得這很奇怪。如果是將viewController分配給self.presentingViewController,不應該調用

[self.presentingViewController dismissModalViewControllerAnimated:NO]; 

我已經改變了他的代碼,以

.H

@property (retain) UIViewController *presentingViewController; 

.M

@synthesize presentingViewController = _presentingViewController; 

和我做的是:

self.presentingViewController = viewController; 

然後

[self.presentingViewController dismissModalViewControllerAnimated:NO]; 

問題是,self.presentingViewController在這一行是零,甚至被聲明爲保留,永遠不會被釋放。

任何線索?

感謝

回答

0

當您添加實例變量UIViewController *_presentingViewController時,是否刪除了實例變量UIViewController *presentingViewController?如果不是,我會在某個時候無意中使用錯誤的錢。

步進通過..原來你有變量實例

UIViewController *presentingViewController; 

而且從你在代碼中的某個時刻,設置和獲取變量

- (UIViewController *)presentingViewController; 
- (void)setPresentingViewController:(UIViewController *)val; 

塊內的兩個存取方法屬性語法糖,他不:

[self setPresentingViewController: viewController]; // uses setter 

然後

[presentingViewController dismissModalViewControllerAnimated:NO]; // uses instance variable 

這是很好的,但是你認爲它應該是

UIViewController *localPresentingViewController = [self presentingViewController]; // uses getter 
[localPresentingViewController dismissModalViewControllerAnimated:NO]; 

這也是好的,但有些不必要。所以現在

@synthesize presentingViewController = _presentingViewController; 

你有

UIViewController *presentingViewController; 
UIViewController *_presentingViewController; 

// These now get/set _presentingViewController 
- (UIViewController *)presentingViewController; 
- (void)setPresentingViewController:(UIViewController *)val; 

但幾乎可以肯定,你的地方是混淆兩個實例變量(或者你不知道你 - :

然後你添加一個新的實例變量有兩個ivars)呈現ViewController/_presentingViewController,並仍然有一個引用presentationViewController伊娃,導致你認爲你的財產是零。

+0

嗨,我沒有聲明伊娃,我只是使用@synthesize presentsViewController = _presentingViewController來合成它;我想無論如何都會創建下劃線伊娃。現在它工作正常。該教程中的代碼有很多這樣的小問題,並且我有很多時間修復它們。無論如何,+1爲您的答案。 – SpaceDog 2012-02-26 10:06:49

+0

當你說'我想會創建下劃線伊娃' - 這聽起來像你沒有意識到,這是全部合成。它在編譯時創建var,getter方法和setter方法,這只是爲了節省輸入。如果var,getter或setter已經存在(因爲你輸入了它),它不會再添加它。合成foo;創建一個名爲foo的ivar, - (id)foo;方法和 - (void)setFoo:(id)arg;方法。使用@synthesize上的選項,您可以使用自定義名稱來實現這些選項,但除非您有充分的理由,否則應該使用默認值。 – hooleyhoop 2012-02-26 11:00:53

+1

屬性只是遺留物鏡-c的語法糖。在現代Objective-C(我們用今天的iOS應用程序構建的那種)中,聲明一個與屬性傳導相同名稱的伊娃是不必要的,並且令人困惑(如OP所示)。請參閱https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProperties.html – kamprath 2012-02-26 15:41:06

0

你是正確的,它應該是:

[self.presentingViewController dismissModalViewControllerAnimated:NO]; 

然而,恢復此:

@synthesize presentingViewController; 

,並刪除了類似的尋找變量的實例裝修:

UIViewController *presentingViewController; 
+0

謝謝。我懷疑作者是錯的。 – SpaceDog 2012-02-25 10:58:50

+1

@Digital - 作者代碼沒有錯。 – hooleyhoop 2012-02-25 11:07:40

+0

@hooleyhoop - 是的,他們創建了一個實例變量presentViewController和一個屬性presentsViewController。他們將創建的視圖控制器分配給屬性版本,但隨後使用實例版本來顯示/關閉模型視圖控制器。由於實例變量從未鏈接到該屬性,因此這不起作用。此外,只有一個實例變量和屬性名稱相同的壞風格。不需要實例變量,因此我建議OP刪除它,並只使用變量的屬性版本。 – kamprath 2012-02-25 21:54:54