2011-09-07 58 views
0

我有兩個類:問題有關創建的UITextField編程

  • RootViewController.h
  • RootViewController.m

在我RootViewController.h

// in .h file 
UITextField* myTextField_; 

@property (nonatomic, retain) UITextField* myTextField. 

在我的RootViewController的.m

// in .m file 
@synthesize myTextField = myTextField_ 

// in dealloc 
[myTextField_ release] 


// in viewDidLoad 
UITextField* tf = [[UITextField alloc] init] initWithFrame:CGRectMake(200,6,100,30)]; 
[nameTextField_ = tf]; 
[tf release] 

我的問題是, 這是否會造成任何內存泄漏?或者會崩潰?有沒有方法來創建UITextField的實例,所以我保留對它的引用?也許

myTextField_ = [[UITextField alloc] init] initWithFrame:CGRectMake(200,6,100,30)]; 

那就夠了嗎?

謝謝!

+0

不知道爲什麼你有文本字段作爲屬性和合成它。你希望textfield可以從類RootviewController外部訪問?這聽起來對我來說是個壞主意。而且,如果沒有屬性和綜合線,你的代碼仍然可以正常工作。 – ophychius

+0

有趣的評論。我已經開始使用財產和綜合所有的東西(也許它是壞的?誰知道)的教程。至於我可能會使它私人或如此 – bubbles

+0

有文本字段作爲屬性是好的,但如果它只是在類中使用移動屬性聲明到.m文件中的類擴展名。只是將項目放入您想要暴露給系統其餘部分的.h文件中。 – zaph

回答

3

的simpliest方法是做到這一點是這樣的:

.H:

UITextField *myTextField; 
@property (nonatomic, retain) UITextField *myTextField; 

.M

@synthesize myTextField; 

- (void)viewDidLoad { 
    myTextField = [[UITextField alloc] initWithFrame:CGRectMake(200,6,100,30)]; 
} 

- (void)dealloc { 
    [myTextField release]; 
} 

你將不得不被分配在最乾淨的發佈一個實例方式,你會一直參考這個文本框。

+1

這是要走的路,再一次,不確定財產和綜合。如果您希望文本字段中的文本可用,您可以將它存儲在屬性(和綜合)的NSString中,或者創建一個自定義getter,以直接從TextField獲取它 – ophychius

1

是的,這會做:

myTextField_ = [[UITextField alloc] initWithFrame:CGRectMake(200,6,100,30)]; 

您也可以使用此:

self.myTextField = [[UITextField alloc] initWithFrame:CGRectMake(200,6,100,30)] autorelease]; 

(使用它會保留,使用直接在成員myTextField_它不會(當屬性時自動)保留)。另外alloc會將retainCount設置爲1,因此它最終需要被釋放(在您的情況下,您可以使用[myTextField_ release];self.myTextField=nil;dealloc;

不知道這是什麼(我相信它會顯示一些編譯錯誤): [nameTextField_ = tf];

+0

'alloc'將* not *設置保留計數爲1.它只返回一個必須是'release'd的對象,該對象可能是一個不同的對象,而不是由後續的'init'返回的對象(其中'init'只保證它實際上消耗一個保留計數,並在返回的對象不同的情況下產生另一個保留計數)。 – bbum

+0

不知道這是真的:http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/Reference/Reference.html#//apple_ref/occ/clm/NSObject/ alloc –

+0

文檔有誤(歸檔)。有很多+ alloc實現可以返回singletons和/或其他保留數爲* not * 1的對象(謝謝指出錯誤的文檔)。 – bbum

1

你不應該做[tf release]因爲你是直接訪問您的變量。

如果您通過self.表示法訪問它,它將被稱爲[tf retain],然後您應該釋放tf。所以在你目前的版本中,除了你要發佈的版本之外,一切都可以。

+0

好點。謝謝! – bubbles

1

[nameTextField_ = tf];


變化:

[自setMyTextField:TF]