0

プロパティの使用 弱い参照を持つオブジェクトに対して、一般に公開されているゲッターと非公開に公開されているセッターが必要です。クラス拡張を使用して機能するものがあると思いました。それは、オブジェクトを nil に設定する前と後の両方で、ゲッターを呼び出すまでです。オブジェクトが nil に設定される前または後にのみ呼び出した場合、ゲッターは機能しました。ここに私が持っているものがあります:


Bar.h

#import <Foundation/Foundation.h>

@interface Bar : NSObject
@property (nonatomic, readonly, weak) NSObject *object;  // note only readonly
- (id) initWithObject:(NSObject *)object;
@end

Bar.m

#import "Bar.h"

@interface Bar ()  // class extension
@property (nonatomic, readwrite, weak) NSObject *object;  // note readwrite
@end

@implementation Bar

- (id) initWithObject:(NSObject *)object
{
    self = [super init];
    if (self)
    {
        self.object = object;
    }
    return self;
}

@end

main.c

#import "Bar.h"

int main(int argc, char *argv[])
{
    @autoreleasepool {

        // Call getter once, before setting the object to nil.
        // This appears to work.
        NSObject *object1 = [[NSObject alloc] init];
        Bar *bar1 = [[Bar alloc] initWithObject:object1];
        NSLog(@"before      - bar1.object[%p] object1[%p]",bar1.object, object1);

        // Call getter once, after setting the object to nil.
        // This appears to work.
        NSObject *object2 = [[NSObject alloc] init];
        Bar *bar2 = [[Bar alloc] initWithObject:object2];
        object2 = nil;
        NSLog(@"after       - bar2.object[%p] object2[%p]",bar2.object, object2);

        // Call getter twice, before and after setting the object to nil.
        // This appears to work to work for the first call to the getter.
        NSObject *object3 = [[NSObject alloc] init];
        Bar *bar3 = [[Bar alloc] initWithObject:object3];
        NSLog(@"both before - bar3.object[%p] object3[%p]",bar3.object, object3);
        object3 = nil;
        NSLog(@"both after  - bar3.object[%p] object3[%p]",bar3.object, object3);

        return 0;
    }
}

結果

before      - bar1.object[0x9623030] object1[0x9623030]
after       - bar2.object[0x0] object2[0x0]
both before - bar3.object[0x7523d90] object3[0x7523d90]
both after  - bar3.object[0x7523d90] object3[0x0]

私はそれが次のようになることを期待していましboth afterた: both after - bar3.object[0x0] object3[0x0]

nilオブジェクトを設定する前にゲッターが呼び出されnil、その後再度呼び出されたときに、弱い参照が設定されていないようです。

4

1 に答える 1