4日目:メモリ管理-propertyパラメータ
2018 ワード
1.通常、クラスを参照するには、次の2つの方法があります.
1,#importメソッドによる導入
2.@classによる導入
#importと@classの違い:
1.import方式には、参照されるクラスの変数とメソッドを含む参照されるクラスのすべての情報が含まれます.@class方式はコンパイラにa.hファイルの中でB*bがクラスの声明にすぎないことを教えるだけで、具体的にはこのクラスにどんな情報があるのか、これは知る必要はありません.
2.@class方式では被引用クラス(Bクラス)の名称を知るだけでよいが、現実クラスでは被引用クラスにおける実装変数やメソッドが用いられるため.mファイルには、参照されるクラスのヘッダファイルを含むためにimportを使用する必要があります.
3.一部のファイルが一度に#importされる場合、最初のヘッダファイルが少し変更されると、後でこのファイルに参照されるすべてのクラスが新しくコンパイルされる必要があります.このような効率も考えられます.対照的に,@classを用いると,このような問題は起こらない.
4.メモリ管理_propertyパラメータ:
(クラスのメンバー変数にOCオブジェクトが多いかどうかは、オブジェクト間の管理メモリの問題、特にsetterメソッドでは、コンパイラがpropertyのretainパラメータを導入してメモリを管理します.
1.retain:propertyにretainパラメータがある場合、コンパイラはsetterメソッドにあり、コンパイラは自動的に追加され、古い値をreleaseしてから新しい値をretainします.したがって、クラスで@property int ageなどの基本データ型を定義している場合は、次のようにします.この場合、assign操作(直接付与)が含まれている操作は必要ありませんが、クラスでOCオブジェクトが定義されている場合は、@property(retain)Studio*stuなどのretainを使用する必要があります.
Assign:デフォルトタイプ、setterメソッドは直接値を割り当て、retain操作を行わない.
Readonly:getterのみを生成する方法
Readwirte:setterとgetterのメソッドの両方を生成
copy:setterメソッドreleaseの古い値、さらにcopyの新しい値.
atomic:デフォルトのプロパティ:マルチスレッドセキュリティを提供します.メソッドにロックをかけ、スレッドの安全性(消費性能)を保証します.
nonatomic,代表メソッドはスレッドセキュリティの問題を考慮する必要はありません.
注意:基本的にすべてのプロパティはnonatomicタイプであり、パフォーマンスの問題のためatomicを考慮する必要はありません.
propertyでは、@property(setter=setAge、getter=getAge)int ageなど、setterメソッドとgetterメソッドの名前を指定することもできます.これによりsetterメソッドとgetterメソッドが指定されます.
5.自動リリースプール:
OCの中の1種のメモリの自動回収のメカニズムで、普通はいくつかの臨時の変数を自動放出池の中に置くことができて、統一的に回収して放出します
プールを自動的に解放して破棄すると、プール内のすべてのオブジェクトがreleaseメソッドを呼び出します.
OCオブジェクトはautoreleaseメッセージを送信するだけで、このオブジェクトを最近の自動リリースプールに追加します(スタックトップのリリースプール)
Autoreleaseは実際にはreleaseの呼び出しを遅らせただけで、autoreleaseのたびに現在のautorelease poolにオブジェクトを入れただけで、poolが解放されると、そのpoolのすべてのオブジェクトがreleaseを呼び出されます.
1,#importメソッドによる導入
2.@classによる導入
#importと@classの違い:
#import "B.h"
@interface A:NSObject {
B *b;
}
@end
1.import方式には、参照されるクラスの変数とメソッドを含む参照されるクラスのすべての情報が含まれます.@class方式はコンパイラにa.hファイルの中でB*bがクラスの声明にすぎないことを教えるだけで、具体的にはこのクラスにどんな情報があるのか、これは知る必要はありません.
2.@class方式では被引用クラス(Bクラス)の名称を知るだけでよいが、現実クラスでは被引用クラスにおける実装変数やメソッドが用いられるため.mファイルには、参照されるクラスのヘッダファイルを含むためにimportを使用する必要があります.
3.一部のファイルが一度に#importされる場合、最初のヘッダファイルが少し変更されると、後でこのファイルに参照されるすべてのクラスが新しくコンパイルされる必要があります.このような効率も考えられます.対照的に,@classを用いると,このような問題は起こらない.
4.メモリ管理_propertyパラメータ:
(クラスのメンバー変数にOCオブジェクトが多いかどうかは、オブジェクト間の管理メモリの問題、特にsetterメソッドでは、コンパイラがpropertyのretainパラメータを導入してメモリを管理します.
1.retain:propertyにretainパラメータがある場合、コンパイラはsetterメソッドにあり、コンパイラは自動的に追加され、古い値をreleaseしてから新しい値をretainします.したがって、クラスで@property int ageなどの基本データ型を定義している場合は、次のようにします.この場合、assign操作(直接付与)が含まれている操作は必要ありませんが、クラスでOCオブジェクトが定義されている場合は、@property(retain)Studio*stuなどのretainを使用する必要があります.
Assign:デフォルトタイプ、setterメソッドは直接値を割り当て、retain操作を行わない.
Readonly:getterのみを生成する方法
Readwirte:setterとgetterのメソッドの両方を生成
copy:setterメソッドreleaseの古い値、さらにcopyの新しい値.
atomic:デフォルトのプロパティ:マルチスレッドセキュリティを提供します.メソッドにロックをかけ、スレッドの安全性(消費性能)を保証します.
nonatomic,代表メソッドはスレッドセキュリティの問題を考慮する必要はありません.
注意:基本的にすべてのプロパティはnonatomicタイプであり、パフォーマンスの問題のためatomicを考慮する必要はありません.
propertyでは、@property(setter=setAge、getter=getAge)int ageなど、setterメソッドとgetterメソッドの名前を指定することもできます.これによりsetterメソッドとgetterメソッドが指定されます.
5.自動リリースプール:
OCの中の1種のメモリの自動回収のメカニズムで、普通はいくつかの臨時の変数を自動放出池の中に置くことができて、統一的に回収して放出します
プールを自動的に解放して破棄すると、プール内のすべてのオブジェクトがreleaseメソッドを呼び出します.
OCオブジェクトはautoreleaseメッセージを送信するだけで、このオブジェクトを最近の自動リリースプールに追加します(スタックトップのリリースプール)
Autoreleaseは実際にはreleaseの呼び出しを遅らせただけで、autoreleaseのたびに現在のautorelease poolにオブジェクトを入れただけで、poolが解放されると、そのpoolのすべてのオブジェクトがreleaseを呼び出されます.