gpt4 book ai didi

ios - 在我的应用程序中发现了一个 NSZombie ......现在怎么办?

转载 作者:可可西里 更新时间:2023-11-01 05:13:10 25 4
gpt4 key购买 nike

我有一个 NSManagedObject 的子类,它有一些真正是枚举的“整数 32”属性。这些枚举在我的模型的 .h 文件中定义如下:

typedef enum {
AMOwningCompanyACME,
AMOwningCompanyABC,
AMOwningCompanyOther
} AMOwningCompany;

我需要显示一个 TableView 来显示此自定义对象的每个属性的值,因此对于每个枚举,我都有一个看起来像这样的方法来返回字符串值:

-(NSArray*)stringsForAMOwningCompany
{
return [NSArray arrayWithObjects:@"ACME Co.", @"ABC Co.", @"Other", nil];
}

在我的 TableView 中,我遍历了我的 NSManagedObject 的属性(使用 NSEntityDescriptionattributesByName 并且我为每个属性调用了一个调用适当的“stringsFor”方法以返回该特定属性的字符串的辅助方法:

-(NSArray*)getStringsArrayForAttribute:(NSString*)attributeName
{
SEL methodSelector = NSSelectorFromString([self methodNameForAttributeNamed:attributeName]);
NSInvocation* invocation = [NSInvocation invocationWithMethodSignature:[[AMProperty class] instanceMethodSignatureForSelector:methodSelector]];
[invocation setSelector:methodSelector];
[invocation setTarget:self.editingPole];
[invocation invoke];

NSArray* returnValue = nil;
[invocation getReturnValue:&returnValue];

return returnValue;
}

我的 TableView 的 cellForRowAtIndexPath 如下所示:

...
NSString* itemName = self.tableData[indexPath.row];
NSAttributeDescription* desc = itemAttributes[itemName];

NSString* cellIdentifier = [self cellIdentifierForAttribute:desc]; // checks the attribute type and returns a different custom cell identifier accordingly
if ([cellIdentifier isEqualToString:@"enumCell"])
{
// dequeue cell, customize it
UITableViewCell* enumCell = ...
...
NSArray* stringValues = [[NSArray alloc] initWithArray:[self getStringArrayForAttribute:itemName]];
int currentValue = [(NSNumber*)[self.editingPole valueForKey:itemName] intValue];
enumCell.detailTextLabel.text = (NSString*)stringValues[currentValue];
return enumCell;
}
...

只有一个属性,我一直在 NSInvocation 的返回数组上崩溃:

-[__NSArrayI release]: message sent to deallocated instance 0x856a4b0

使用 Zombies Profiler,我看到:

Instruments Screenshot

我正在使用 ARC。我该如何进一步调试?

最佳答案

我自己最近遇到了一个非常相似的问题,我花了一段时间才弄清楚我做错了什么。这里发布了一个额外的版本——因为你的指针 returnValue__strong (默认值),ARC 认为该对象是通过该指针拥有的,但事实并非如此.

-[NSInvocation getReturnValue:] 没有取得它的所有权,通过指针地址的“赋值”绕过了 ARC 通常使用的 objc_storeStrong() .

解决方案很简单:将指针标记为__unsafe_unretained。这是事实;该对象不会通过此指针保留(如果它是 __strong 就会保留),并且 ARC 不得在此处释放它。

关于ios - 在我的应用程序中发现了一个 NSZombie ......现在怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18295170/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com