消息发送到使用Pinterest SDK的解除分配的实例

我正在使用Pinterest iOS SDK在我的iPad应用程序中共享项目。 下面的代码片断总是会随着一条message sent to deallocated instance带有注释的行上的message sent to deallocated instance

 NSString *clientId = [NSMutableString stringWithString:@"1431665"]; NSLog(@"clientId: %@", clientId); Pinterest *pinterest = [[Pinterest alloc] initWithClientId:clientId]; NSLog(@"gone: %@", clientId); // <- CRASH! 

我正在使用NSMutableString stringWithString来模拟我的应用程序的条件。 我实际上并没有在我的代码中使用这一行。

即使不输出最后一行的clientId ,应用程序在离开块时也会崩溃。 我认为这是因为ARC试图释放已经被释放的引用。

看起来像Pinterest SDK一定是做了一些不可思议的事情,并且摧毁了我传入的string。有什么方法可以解决这个问题吗?

编辑1

简化testing用例。

编辑2

看起来像Pinterest SDK正在使用clientId参数。 基于叮当声ARC文档 ,指出这个__attribute((ns_consumed))的方法是用__attribute((ns_consumed))来表示。

新的问题 :是否有可能表明这个ARC没有修改方法的签名添加属性?

编辑3

所以这是有效的,但它是丑陋的罪? 有另一种方法吗?

 NSString *clientId = [NSMutableString stringWithString:@"1431665"]; [clientId performSelector:NSSelectorFromString(@"retain")]; // <- UGLY! NSLog(@"clientId: %@", clientId); Pinterest *pinterest = [[Pinterest alloc] initWithClientId:clientId]; NSLog(@"gone: %@", clientId); 

我所做的就是创build一个代表Pinterest类的静态variables:

 //I put this outside my @implementation code at the top of my m file static Pinterest *_pinterest = nil; // instantiating static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _pinterest = [[Pinterest alloc] initWithClientId:clientId]; }); 

我认为,Pinterest认为每个人都会把他们的课程当作一个静态单身人士,因为这可能是他们内部做的。 公平地说,在大多数情况下,我不会预见在一个应用程序中使用多个客户端ID。 不过,我同意这是一个愚蠢的疏忽。 他们甚至没有logging这种行为,他们在想什么?

我目前的解决方法,这似乎是迄今为止的想法最hacky是这个包装类,不使用ARC:

 + (void) createPinWithClientId:(NSString *)clientId imageURL:(NSURL *)imageURL sourceURL:(NSURL *)sourceURL description:(NSString *)descriptionText { Pinterest *pinterest = [[Pinterest alloc] initWithClientId:clientId]; [pinterest createPinWithImageURL:imageURL sourceURL:sourceURL description:descriptionText]; } 

关键是要禁用该类的ARC,从而使运行时不释放clientId