これにより、そのinitメソッドに割り当てられた文字列がメモリリークを引き起こしますか?文字列が参照されておらず、自動解放されていないため。
はい、正確に。あなたはそれを持っているようです。
initメソッドで文字列を割り当てないと、anotherStringを割り当てる直前にait.stringを呼び出すとどうなりますか?
次の場合、unknownObjectが何を参照するのかわからないということですか?:-
It *ait = [[It allow] init];
NSString *unknownObject = ait.string;
これはナンセンスです。アクセサメソッドを追加するのを忘れましたか?
Objective-cは、Javaなどのインスタンス変数にアクセスするために「ドット構文」を使用しません。クラス'it'のインスタンスがある場合は、アクセサ'getter'メソッドを呼び出すことによってそのインスタンスの外部からのみ'string'変数にアクセスできます。これはオプションではありません。self.stringはメソッド呼び出し[selfstring]のショートカットであり、このメソッドは表示されたコードには存在しません。
アクセサメソッドが他の場所で定義されていると仮定すると、stringと呼ばれるインスタンス変数(これは世界で最悪の変数名です)はnilに等しくなります。Objective-cでは、動作が他の多くの言語が同様のnullを処理するのとは異なるため、nilオブジェクトを非常に注意深く処理する必要があります。
Objective-cではこれで問題ありません。
NSString *nilString = nil;
[nilString writeToFile:@"/this_file_cannot_exist.data"];
他の多くの言語はここでクラッシュするか、例外をスローします。操作は失敗する可能性がありますが、アプリは引き続き実行されるため、これは危険な場合があります。他の言語ではこれがたくさん見られるので、それは素晴らしいことでもあります。
someObject = controller.currentValue()
if( someObject!=null )
someObject.writeToFile("myFile.data")
Objective-cでは、「if(..)」行はまったく必要ありません。
initメソッドとdeallocメソッド内でアクセサメソッドを呼び出さないように注意する必要があります。これにより、サブクラスが破損する可能性があります。それ以外の
- (void)dealloc {
[self.string release]; // This is [[self string] release]
...
あなたはただ使うべきです
- (void)dealloc {
[string release];
...
危険であるだけでなく、[自己文字列]の呼び出しも不要です。同じことがあなたのinitメソッドにも当てはまります
if(self=[super init]){
self.string = [[NSString alloc]init]; // shortcut for [self setString:[[NSString alloc] init]]
...
使用するだけ
if(self=[super init]){
string = [[NSString alloc] init];
...