我正在使用 Pinterest iOS SDK 在我的 iPad 应用程序中共享项目。以下代码片段总是会崩溃,message sent to deallocated instance
并在注释所在的行显示 a:
NSString *clientId = [NSMutableString stringWithString:@"1431665"];
NSLog(@"clientId: %@", clientId);
Pinterest *pinterest = [[Pinterest alloc] initWithClientId:clientId];
NSLog(@"gone: %@", clientId); // <- CRASH!
我NSMutableString stringWithString
用来模拟我的应用程序中的条件。我实际上并没有在我的代码中使用该行。
即使不在clientId
最后一行输出,应用程序在离开块时也会崩溃。我认为这是因为 ARC 试图释放已经被释放的引用。
似乎 Pinterest SDK 必须做一些奇怪的事情并破坏我传入的字符串。在他们修复他们的代码时有什么方法可以解决这个问题吗?
编辑 1
简化了测试用例。
编辑 2
看起来 Pinterest SDK 正在使用该clientId
参数。根据clang ARC 文档,向 clang 表明这一点的方法是用__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);