Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/115.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在ARC模式下保持自我,例如SKProductsRequest,在启动方法中保持自我,然后在响应返回后释放?_Ios_Asynchronous_Automatic Ref Counting_Retain - Fatal编程技术网

Ios 如何在ARC模式下保持自我,例如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

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

我相信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