如何在ARC模式下保留self,如SKProductsRequest,在start方法中保留self,然后在响应返回后释放?

时间:2014-09-12 03:18:34

标签: ios asynchronous automatic-ref-counting retain

请参阅以下代码示例(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);

2 个答案:

答案 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 defaultCenter] addObserver:self不保留自我观察者,它是弱引用。

对不起,对不起。 (我从来没有注意到它,谢谢!)但基本的想法仍然是一样的。例如,NSNotificationCenter -addObserverForName:object:queue:usingBlock:可以通过块保留对象。 NSRunLoop + NSTimer也是如此。 NSNotificationCenter defaultCenter,NSRunLoop主线程上的主循环,依此类推,有框架或OS保留的对象。所以这些对象可以保留你的对象。