2012-02-28 11 views
3

私はxcodeのスーパーが何を意味するかについては少し質問があります。たとえば、私は次のコードを持っています。私がdeallocメソッドで[super dealloc]を最初に言ったとしたらうまくいきますか?あるいはスーパーはいつも最後に来るべきですか?正確に何がスーパーです - 私はそのスーパークラスを知っていますが、それは親クラスですか?Objective-CのSUPERとは - iOS

これは、これは私がすべての上にチェックして上記インターフェース

- (id)initWithStyle:(UITableViewStyle)style 
{ 
self = [super initWithStyle:style]; 
if (self) { 
    // Custom initialization 
} 
return self; 
} 

- (void)dealloc 
{ 

[self.twitterManager release]; 
[tweets release]; 
[lastRefreshedLabel release]; 
[super dealloc]; 

}

ための.mクラスからいくつかのコードでこのクラスの.hファイル

@interface TwitterTableViewController : PullRefreshTableViewController<TweetDelegate> 

です満足のいく知識はまだありません。誰かがこれをlaymansの中で説明できるのなら、最も良いと言えます。ありがとう

+0

他のプログラミング言語に精通している方は** parent ** – Bot

+3

とお考えください。これは小さな質問ではありません。それは大きな問題です。アプリケーション開発を行う前にObjective-Cに精通していることを確認することをお勧めします。 –

+0

[Objective-Cのスーパーはどういうものなのですか?](http://stackoverflow.com/questions/3095360/what-exactly-is-super-in-objective-c)| [私はスーパーを呼び出す必要がありますか?](http://stackoverflow.com/questions/3906704/when-should-i-call-super)| [スーパーローカル変数はありますか?](http://stackoverflow.com/questions/2962735/is-super-local-variable)| [\ super dealloc \]の後にコードを書くのは大丈夫ですか?(http://stackoverflow.com/questions/4594305/is-it-ok-to-write-code-after-super-dealloc) –

答えて

5

superスーパークラスの実装を呼び出します。あなたの場合、これはPullRefreshTableViewControllerになります。

あなた自身のコードの前または後にsuperを呼び出すべきかどうかは、実際にはメソッドをオーバーライドすることによって達成したいことに依存します。

deallocの場合は、このquestionをご覧ください。Nick Bullと記載されています。

+6

間違いなく_not_しかし、deallocのために!それは常に最後にあるはずです。そうしないと、残りのivarsの解放が完了する前に[super dealloc]をNSObjectに呼び出すことになります。 – jrturton

+0

問題ありません。 – jrturton

+0

@ErikAignerこの回答を参照してくださいhttp://stackoverflow.com/questions/909856/why-do-i-have-to-call-super-dealloc-last-and-not-first –

1

スーパーは、あなたのケースで

を拡張し、あなたがimpementingしているクラスの父別名PullRefreshTableViewController

ある/スーパーオブジェクトの略

行動のこの種のは指向すべてのオブジェクトのベースがありますobj-cのような言語。あなたは、スーパークラスを分析している場合で

は、メッセージが現在のクラスの親クラス( スーパークラス)に送信することを指定し

-(UITableviewStyle *) initWithStyle:style 
+0

上記のケースで私は言うことができます - (void)dealloc { [super dealloc]; [self.twitterManager release]; [つぶやきのリリース]; [lastRefreshedLabel release]; } – CodeGeek123

+1

正確には、確かに:) – holographix

+3

@ CodeGeek123いいえ、それはできません。 '[super dealloc]'は、deallocの最後に呼び出されなければなりません。 Erikの答えである@jrturtonのコメント –

1

superと呼ばれる方法があります。あなたはPullRefreshTableViewControllerから継承しているので、それが送信されます。

3

スーパークラスは、「親クラス」と見なすことができます。 [super dealloc]は、現在のオブジェクト(またはクラスメソッドから呼び出す場合はそのクラス)のスーパー/親クラスのメソッドdeallocの実装を呼び出します。

しかし、「スーパーは常に最後に来なければならない」というルールはありません。 deallocが常に最後に来なければならない理由は、オブジェクトを破棄するためです。返された後にオブジェクトにアクセスすると、オブジェクトがクラッシュします。

1

superが親クラスです(ここではPullRefreshTableViewController)。 [super dealloc]を呼び出すと、独自のdeallocメソッドを実装する必要がある場合に常に実行する必要があります。親クラス(およびその親クラスなど)は、後でクリーンアップすることができます。自分のリリースを実行し、親クラスが同じことをするのは良い考えです。なぜなら、親クラスがあなたの足元から逃げることは決してできないからです。

2

ここでの既存の回答に加えて、この回答の情報は「スーパー」と呼ぶ時期を決めるのに役立ちます。

子オブジェクト/ビュー/ビューコントロールが作成/初期化されたときに呼び出されるメソッドは、最初にスーパークラスを呼び出すことです(呼び出したい場合)。

子オブジェクト/ビュー/ビューコントローラが破棄/削除されると、メソッドの最後にスーパーを呼び出します。

例:

// methods called when the you are loading/showing with the view controller 
    -(void)viewDidLoad { 
     [super viewDidLoad]; 
     //call super and then all your code goes here 
    } 

    -(void)viewWillAppear:(BOOL)animated { 
     [super viewWillAppear:animated]; 
     //call super and then all your code goes here 
    } 

// methods called when the you are done with the view controller 
    - (void)viewWillDisappear:(BOOL)animated{ 
     //all your code goes here and then call super 
     [super viewWillDisappear:animated]; 
    } 
    - (void)viewDidUnload { 
     //all your code goes here and then call super 
     [super viewDidUnload]; 
    } 

-initスーパーが最初に呼び出されるため同様に、-deallocのために、スーパーは、最後に呼び出されます。

これはDemystifiesを望んでいます。

関連する問題