gpt4 book ai didi

objective-c - @property 保留或复制

转载 作者:搜寻专家 更新时间:2023-10-30 20:01:23 26 4
gpt4 key购买 nike

首先我读到这个article

我想我应该在我的程序中使用“复制”。问题是使用 NSMutableDictionary 副本,它将终止。

***** 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“-[__NSCFDictionary removeAllObjects]:发送到不可变对象(immutable对象)的变异方法”**

我不知道“发送到不可变对象(immutable对象)的变异方法”。我没有将 NSDictionary 设置为 NSMutabledictionary 指针。

这是我的代码



.h文件

@interface Button : NSObject {

@private
NSString* gID;
NSString* gBackColor;
NSString* gIconImage;
int gIndex;
BOOL gEnable;
BOOL gVisible;
NSString* gText;

NSMutableDictionary* gEvents;


BOOL gUseCircle;
}

@property (nonatomic,copy) NSString *ID;
@property (nonatomic,copy) NSString *BackColor;
@property (nonatomic,copy) NSString *IconImage;
@property int Index;
@property BOOL Enable;
@property BOOL Visible;
@property (nonatomic,copy) NSString *Text;
@property (nonatomic,getter=getEvents,retain) NSMutableDictionary *Events;
@property BOOL UseCircle;

@end


.m文件

@implementation Button
@synthesize ID = gID;
@synthesize BackColor = gBackColor;
@synthesize IconImage = gIconImage;
@synthesize Index = gIndex;
@synthesize Enable = gEnable;
@synthesize Visible = gVisible;
@synthesize Text = gText;
@synthesize Events = gEvents;
@synthesize UseCircle = gUseCircle;

-(NSMutableDictionary*) getEvents
{
if (!gEvents)
{
gEvents = [[NSMutableDictionary alloc] initWithCapacity:20];
}
return gEvents;
}

- (id) init
{
self = [super init];
if (self != nil)
{
gID = @"";
gBackColor = @"";
gIconImage = @"";
gIndex = 0;
gText = @"";

gUseCircle = NO;
}
return self;
}

- (void) dealloc
{
[gID release];
[gBackColor release];
[gIconImage release];
[gText release];

[gEvents removeAllObjects];
[gEvents release];
gEvents = nil;

[super dealloc];
}


并实现

tBtnXML.Events = [self SplitEvents:tNode];


SplitEvents 函数:

-(NSMutableDictionary*) SplitEvents:(NSDictionary*)pEvents
{
NSMutableDictionary *tEvents = [[NSMutableDictionary alloc] initWithCapacity:5];
// code blabla
//.
//.
//.
[tEvents setObject:tEvent forKey:[NSNumber numberWithInt:tEventName]];
[tEvent release];



return [tEvents autorelease];
}

但我将 NSMutableDictionary* gEvents 属性从 copy 更改为 retain ,它执行正常。

有人能告诉我我的代码有什么问题吗?

如果我的代码使用 dealloc 不正确,请告诉我。

谢谢你的赏识。





是的,所以我修复了我的二传手:

-(void) setEvents:(NSMutableDictionary*) pEvents
{
NSMutableDictionary* tNewDict = [pEvents mutableCopy];
[gEvents removeAllObjects];
[gEvents release];
gEvents = tNewDict;
}

这项工作没有错误。

对我帮助很大。

但是我不能投票>"<~

谢谢巴伐利亚人 :)

最佳答案

一般来说,可变属性应该是retain而不是copy。当您将属性声明为 copy 时,合成的 setter 方法将 -copy 发送到分配给该属性的对象。对于可变对象(例如 NSMutableDictionary),向它们发送 -copy 会生成一个不可变副本,有效地创建一个不可变类型的对象(例如 NSDictionary) 代替。

所以在:

tBtnXML.Events = [self SplitEvents:tNode];

合成的 setter 将 -copy 发送到 [self SplitEvents:tNode],从而创建该字典的不可变副本(即 NSDictionary 实例),并将其分配给 gEvents。这是错误的原因:gEvents 被声明为 NSMutableDictionary 但指向一个 NSDictionary

需要注意的是,可变类通常会声明一个 -mutableCopy 方法来生成可变副本。但是,它不被声明的属性使用。如果您不想使用 retain,则需要实现一个使用 -mutableCopy 的自定义 setter。

关于objective-c - @property 保留或复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5616170/

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