请参阅以下代码示例(ARC模式),SKProductsRequest如何保留自己等待响应?我的意思是在ARC模式下你不能写[self retain],SKProductsRequest如何在start方法中保留self,然后在响应后释放self?如你所知,代表总是很弱。
SKProductsRequest只是这里的一个例子,现在我需要这样一个服务类,并且不知道如何在请求发送时保留自己然后在响应回来时释放自己,任何有想法的人请一起分享和讨论,谢谢提前。
SKProductsRequest *productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:set];
productRequest = productsRequest;
productsRequest.delegate = self;
[productsRequest start];
PS: 关于objc_setAssociatedObject,需要外部长实时对象来保持关系。
objc_setAssociatedObject(externalLiveObj, &kRetainSelfKey, self, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
答案 0 :(得分:5)
给自己一个实例变量。启动请求时将其设置为self
:
@implementation MyRequestDelegate {
MyRequestDelegate *me;
}
- (void)startProductsRequest {
SKProductsRequest *productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:set];
productRequest = productsRequest;
productsRequest.delegate = self;
[productsRequest start];
me = self; // this retains self
}
然后在委托方法中,将其设置回nil
:
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {
// process response here, and then...
me = nil;
}
答案 1 :(得分:0)
我相信SKProductsRequest使用NSNotification东西和/或NSRunLoop。此崩溃日志StoreKit SKProductsRequest Crash意味着。
1 StoreKit 0x00003e18 -[SKProductsRequest handleFinishResponse:returningError:] + 40
2 StoreKit 0x000050c4 -[SKRequest _requestFinishedNotification:] + 152
3 Foundation 0x00019b9a _nsnote_callback + 150
4 CoreFoundation 0x0006c2de __CFXNotificationPost_old + 390
5 CoreFoundation 0x0001ab32 _CFXNotificationPostNotification + 122
6 Foundation 0x000048e4 -[NSNotificationCenter postNotificationName:object:userInfo:] + 64
所以我想,在SKProductsRequest中,
[[NSNotificationCenter defaultCenter] addObserver:self ...
defaultCenter对象保留SKProductsRequest对象。
修改强>
对不起,对不起。 (我从来没有注意到它,谢谢!)但基本的想法仍然是一样的。例如,NSNotificationCenter -addObserverForName:object:queue:usingBlock:可以通过块保留对象。 NSRunLoop + NSTimer也是如此。 NSNotificationCenter defaultCenter,NSRunLoop主线程上的主循环,依此类推,有框架或OS保留的对象。所以这些对象可以保留你的对象。[[NSNotificationCenter defaultCenter] addObserver:self不保留自我观察者,它是弱引用。