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

jia*_*hua 1 asynchronous retain ios automatic-ref-counting

请参阅以下代码示例(ARC模式),SKProductsRequest如何保留自己以等待响应?我的意思是在ARC模式下你不能写[self retain],SKProductsRequest如何在start方法中保留self,然后在响应后释放self?如你所知,代表总是很弱.

SKProductsRequest就是这里的一个例子,现在我需要这样一个服务类,并且不知道如何在请求发出时保留自己然后在响应回来时释放自己,任何有想法的人请一起分享和讨论,在此先感谢.

SKProductsRequest *productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:set];
productRequest = productsRequest;
productsRequest.delegate = self;
[productsRequest start];
Run Code Online (Sandbox Code Playgroud)

PS:关于objc_setAssociatedObject,需要保持保留关系的外部长实时对象.

objc_setAssociatedObject(externalLiveObj, &kRetainSelfKey, self, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
Run Code Online (Sandbox Code Playgroud)

rob*_*off 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
}
Run Code Online (Sandbox Code Playgroud)

然后在委托方法中,将其设置回nil:

- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {
    // process response here, and then...
    me = nil;
}
Run Code Online (Sandbox Code Playgroud)