Ios 如何在ARC模式下保持自我,例如SKProductsRequest,在启动方法中保持自我,然后在响应返回后释放?
请参阅以下代码示例(ARC模式),了解SKProductsRequest如何保持自身以等待响应返回?我的意思是,在ARC模式下,您不能编写[self retain],SKProductsRequest如何在start方法中保留self,然后在响应后释放self?正如你们所知,代表总是软弱的 SKProductsRequest只是这里的一个例子,现在我需要这样一个服务类,不知道如何在请求发出时保持自我,然后在回复回来时释放自己,有想法的人请一起分享和讨论,提前感谢Ios 如何在ARC模式下保持自我,例如SKProductsRequest,在启动方法中保持自我,然后在响应返回后释放?,ios,asynchronous,automatic-ref-counting,retain,Ios,Asynchronous,Automatic Ref Counting,Retain,请参阅以下代码示例(ARC模式),了解SKProductsRequest如何保持自身以等待响应返回?我的意思是,在ARC模式下,您不能编写[self retain],SKProductsRequest如何在start方法中保留self,然后在响应后释放self?正如你们所知,代表总是软弱的 SKProductsRequest只是这里的一个例子,现在我需要这样一个服务类,不知道如何在请求发出时保持自我,然后在回复回来时释放自己,有想法的人请一起分享和讨论,提前感谢 SKProductsReques
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);
我相信SKProductsRequest使用NSNotification内容和/或nsrunlop。此崩溃日志表明
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不保留self observer,它是弱引用
呃,很抱歉。(我没注意到,谢谢!)但基本思想仍然是一样的。例如,NSNotificationCenter-addObserverForName:object:queue:usingBlock:可以通过block.nsrunlop+NSTimer保留对象。NSNotificationCenter defaultCenter、nsrunlop主线程上的主循环等等,框架或操作系统会保留对象。因此,这些对象可以保留您的对象。我认为SKProductsRequest使用NSNotification内容和/或nsrunlop。此崩溃日志暗示了这一点
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不保留self observer,它是弱引用
呃,很抱歉。(我没注意到,谢谢!)但基本思想仍然是一样的。例如,NSNotificationCenter-addObserverForName:object:queue:usingBlock:可以通过block.nsrunlop+NSTimer保留对象。NSNotificationCenter defaultCenter、nsrunlop主线程上的主循环等等,框架或操作系统会保留对象。因此,这些对象可以保留对象。给自己一个实例变量。启动请求时将其设置为
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;
}
给自己一个实例变量。启动请求时将其设置为
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;
}
我很难理解你的问题。你是在问苹果如何实现
SKProductsRequest
,以便它在请求期间保持活动状态?还是在问如何编写自己的类,使用SKProductsRequest
,以便你的对象在SKProductsRequest
操作期间保持活动状态?很抱歉,我的错误glish,我的重点是一个对象如何在异步操作中保持活动状态?这里的例子就是SKProductsRequest。我很难理解你的问题。你是在问苹果如何实现SKProductsRequest
,以便它在请求期间保持活动状态?还是在问如何编写自己的使用SKProductsRequest的类
以便您的对象在SKProductsRequest
操作期间保持活动状态?对不起,我的英语不好,我的关键点是对象如何在异步操作中保持活动状态?SKProductsRequest只是一个例子。[[NSNotificationCenter defaultCenter]addObserver:self不保留self observer,它是弱引用[[NSNotificationCenter defaultCenter]addObserver:self不保留self observer,它是弱引用。要使此想法与多个“用户”一起工作,请我会立即使用一个NSMutableArray
来推/弹出self
。很好,我明白了,这里的关键点是让一个容器来添加/删除self实例以保持保留。谢谢。如果启用了优化(如发布版本中的优化),这个解决方案会起作用吗?设置了变量“me”,但从未使用过。编译器可以很好地删除这些代码行。使用容器(例如NSMutableArray)的解决方案应该是首选。是的,即使在优化条件下也能工作。编译器无法删除me
变量的设置,因为它知道设置强实例变量有副作用,而且其他代码可以使用object\u getIvar
或ivar\u getOffset
来获取实例变量的值e、 为了让这个想法同时适用于多个“用户”,我会使用一个NSMutableArray
,它可以推/弹出self
。太好了,我明白了,这里的关键点是让一个容器来添加/删除self实例以保持保留。谢谢。如果启用了优化,这个解决方案会起作用吗(如在发布版本中)?设置了变量“me”,但从未使用过。编译器可以很好地删除这些代码行。使用容器(例如NSMutableArray)的解决方案应该是首选。是的,即使在优化条件下也能工作。编译器无法删除me
变量的设置,因为它知道设置强实例变量有副作用,而且其他代码可以使用object\u getIvar
或ivar\u getOffset
来获取实例变量的值E