2016-12-02 10 views
1

my own answerを読む。 メンバー/プロパティにweakSelfが必要な理由を十分に理解しています。彼らはメモリサイクルを作成する可能性があります。しかし、プロパティにはメモリの場所があります。 関数にもメモリ位置がありますか?私は、外出先で何かが起こっているという意味ではありませんか?そうであれば、メモリの場所の種類はプロパティの場所とは異なりますか?クロージャ内の関数/メソッドにweakSelfが必要なのはなぜですか?

私は自己を参​​照していない場合は、このエラーが発生します。

メソッド 'alertFunc'をクロージャーで呼び出すには、明示的な 'self'が必要です。わずかに異なっている メイクキャプチャセマンティクスを明示的に

から:

閉鎖でプロパティ「ウィンドウ」への言及は、明示的な「自己を。」が必要です次のように メイクキャプチャセマンティクスに

明示的に私のコードは次のとおりです。私はミート

TLから知っているのiOSオタクに

let another = UIAlertAction(title: "Log", style:UIAlertActionStyle.Default){action in 
logAction() 

} 

private func logAction() { 

print("health") 

} 
+1

機能は、Swiftのファーストクラスタイプです。明らかにそれらは意味的に異なっていますが、事実上関数は単純に異なる種類の変数である可能性があります。 – PeejWeej

答えて

1

クレジット; drはあなたがのために自己を使用する必要がありますインスタンスメソッドですが、クラスメソッドでは必要ありません。クラスは、多くのインスタンスを有することができるが、エラーが1を発生なぜそれが唯一の(また、そのタイプ/クラス/静的関数を含む)自体の宣言

を有することができる:ベア心​​にalertFuncがへの参照を持っていたかもしれませんそれがされている可能性がプロパティ

private func logAction() { 

print("someProperty = \(self.someProperty") 

} 

だから、この場合には、それはあなたが最終的にプロパティに


を参照していることを明らかに明らかです

は、なぜエラーが2発生:あなたは、あなたの関数内selfへの参照を持っていない場合は、インスタンスメソッドとしてそれを書いたので、まだ、自己がある暗黙的に渡されたが、我々は表示されません!

インスタンスメソッドは、実際に自己は、それがかもしれないボンネットの下に自動的に

渡される最初のパラメータのインスタンスを取る機能のためだけの構文糖、である。この

private func alertFunc (_ instance: MyType) { 

print("someProperty = \(instance.someProperty") 

} 

// and actually the call to it *may* look something like this: 

MyType.someFunc(self) 
のように見える
何か

私たちは決して自分が渡されるのを見ません...それは私たちを欺く統語的な砂糖です。

あなたのメソッドが内部的に(つまり、それはそれstatic/type/class methodまたはフリー機能


Alternative1作るために、おそらく実際には最善です)どのような方法でインスタンスの状態に依存しない:フリー機能を使用しています。その後、

class someClass { 

... 

} 
func freeFunc { 
print("Hi this is a free function, written outside the scope of any class...") 
} 

そして、あなたのクロージャ内あなたがfreeFunc()

Alternative2を使用してそれを呼び出す:クラスの機能を使用してください。

class someClass { 
// some other code 

     class private func alertFunc() { 
     print("Hi this was a class function, see the class at the beginning of the func definition") 
} 
} 

そしてあなたの閉鎖以内にあなたはyourClassName.alertFunc()


を使用してそれを呼び出すしかし、なぜそのクラスの機能は、メモリ・サイクルを作成しないということですが、インスタンス機能はありますか? 私はあなたが求めてうれしい:

をインスタンスmehtodsについて、あなたに手を差し伸べるインスタンスごとに、そこに新しいメモリロケーションがあると割り当て解除を持続します新しいメモリ・サイクルを生成します。

クラスメソッドの場合は、クラス/タイプメソッドに到達するたびに、同じクラス/タイプのメソッドに到達し、そのクラスメソッドを永続化している間は、それは一度だけ作成され、完了しました!客観-C(およびC++)で

方法を入力します。

アプリが起動すると、システムはかなり安全にちょうど彼らのクラスのポインタ と共にメモリにそれらの型のメソッドのためのすべての命令 を事前に割り当てることができますオーバーヘッドはほとんどありません。何度も何度も何度も頭上を呼びます。
私は同じことをやっていると思います。

+0

それから。通常の関数ではなく静的な/クラスの関数を使用する方が良いでしょうか? (メモリの割り当てに賢く) –

+0

それで、クラス内の関数を何度も繰り返し呼び出すと、それ自体はますます多くのインスタンスを作成します。しかし、それがクラス内の価値を変えているのであればどうですか? (申し訳ありませんが、私はメモリ割り当ての話題で初心者です) –

+0

@ ZonilyJame *だからです。通常の関数ではなく静的/クラス関数を使用し、* < - はメモリ割り当ての問題を忘れてしまいます。そして、関数の*目的*についてのみ考えてください。型/クラスメソッドとインスタンスメソッドの違いを完全に理解していますか? – Honey

2

logAction()と書くと、それは暗黙のうちにself.logAction()を意味します。 (メソッドがいくつかのインスタンスで呼び出されます;指定しない場合は、デフォルトでselfになります)。したがって、クロージャ内にselfを使用しています。つまり、クロージャのキャプチャselfを意味し、強参照または弱参照をキャプチャするかどうかは、 。

関連する問題