プロパティの使用 弱い参照を持つオブジェクトに対して、一般に公開されているゲッターと非公開に公開されているセッターが必要です。クラス拡張を使用して機能するものがあると思いました。それは、オブジェクトを 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
、その後再度呼び出されたときに、弱い参照が設定されていないようです。