3

Person クラスを作成しました。このクラスから 2 つのオブジェクトをインスタンス化します。

int main(int argc, const char * argv[])
{
    @autoreleasepool {
        Person * __weak pweak = [Person new];
        Person *p = [Person personWithName:@"Strong" lastName:nil dateOfBirth:nil];
    }
    return 0;
}

Personクラスはそのメソッドをオーバーライドするためdealloc、割り当て解除されたの名前が出力Personされます。

すべてが期待どおりに進み、weak 変数がインスタンスを存続させませんPerson。ログに次のように表示されます ("John" はPersonオブジェクトのデフォルト名です)。

2013-01-23 17:36:51.333 Basics[6555:303] John is being deallocated
2013-01-23 17:36:51.335 Basics[6555:303] Strong is being deallocated

ただし、弱い変数への代入でファクトリ メソッドを使用すると、次のようになります。

int main(int argc, const char * argv[])
{
    @autoreleasepool {
        Person * __weak pweak = [Person personWithName:@"Weak" lastName:nil dateOfBirth:nil];
        Person *p = [Person personWithName:@"Strong" lastName:nil dateOfBirth:nil];
    }
    return 0;
}

これは私が記録したものです:

2013-01-23 17:44:16.260 Basics[6719:303] Strong is being deallocated
2013-01-23 17:44:16.262 Basics[6719:303] Weak is being deallocated

私は何か間違ったことをしていますか?

Person クラスの次のメソッドが関係している可能性があります。

- (id)initWithName:(NSString *)name lastName:(NSString *)lastName dateOfBirth:(NSDate *)birth {
    self = [super init];
    if (self) {
        _name = name;
        _lastName = lastName;
        _dateOfBirth = birth;
    }
    return self;
}

+ (id)personWithName:(NSString *)name lastName:(NSString *)lastName dateOfBirth:(NSDate *)birth {
    return [[self alloc] initWithName:name lastName:lastName dateOfBirth:birth];
}
4

1 に答える 1

1

ARCメソッドを介してオブジェクトを割り当てると、alloc/init後でオブジェクトを解放する責任がオブジェクトの作成者に与えられます(したがって、オブジェクトを__strongとして保存すると、誰かが所有するまで生き続け、__weakとして保存すると、割り当てが解除されます。誰も所有していません)。

Apple ドキュメントから ( http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/memorymgmt/Articles/mmRules.html#//apple_ref/doc/uid/20000994-BAJHFBGH )

自分が作成したオブジェクトを所有する オブジェクトは、名前が「alloc」、「new」、「copy」、または「mutableCopy」で始まるメソッド (たとえば、alloc、newObject、または mutableCopy) を使用して作成します。

ファクトリ メソッドを処理する場合、ARC は返す変数を自動解放として扱うため、プールが空になると変数が解放されます。実際、ARC はファクトリ メソッドを次のように変換します。

+ (id)personWithName:(NSString *)name lastName:(NSString *)lastName dateOfBirth:(NSDate *)birth 
{
   return [[[self alloc] initWithName:name lastName:lastName dateOfBirth:birth] autorelease];
}
于 2013-01-23T17:05:01.190 に答える