Iphone @property中的内存损坏
我有下一段代码,一个带有这个属性的iVar在它的classIphone @property中的内存损坏,iphone,objective-c,ios,ipad,Iphone,Objective C,Ios,Ipad,我有下一段代码,一个带有这个属性的iVar在它的classdealloc方法中保留和发布。iVar用于两种方法,并不断改变值,但 有时,当我使用时,该值已损坏。为什么呢 h 但是当循环调用方法update:时,它在这行代码中崩溃 [request addPostValue:_idLastMessageFromServer forKey:CONSTANT_XXX]; 使用EXC\u BAD\u访问消息,但原因是什么?此行: _idLastMessageFromServer = [array ob
dealloc
方法中保留和发布。iVar用于两种方法,并不断改变值,但
有时,当我使用时,该值已损坏。为什么呢
h
但是当循环调用方法update:时,它在这行代码中崩溃
[request addPostValue:_idLastMessageFromServer forKey:CONSTANT_XXX];
使用EXC\u BAD\u访问消息,但原因是什么?此行:
_idLastMessageFromServer = [array objectAtIndex:0];
应该是
self.idLastMessageFromServer = [array objectAtIndex:0];
这将直接访问属性而不是变量,从而在赋值过程中触发保留/释放。否则,指针会被分配,但从数组中获取的对象不会被保留,它可能很快会变得无效,并且您会留下一个指向已释放对象的指针。通过使用
\u idLastMessageFromServer
而不是self.idLastMessageFromServer
,您不会保留字符串。允许保留计数降至零,从而取消分配对象。在这一点上,你有一个坏内存的引用,因此应用程序崩溃
除非有充分的理由(比如-init或-dealoc),否则不要直接使用IVAR。改为使用属性
[request addPostValue:self.idLastMessageFromServer forKey:CONSTANT_XXX];
及
我将添加一些关于属性的详细解释
self.idLastMessageFromServer
用于读取属性值时,会调用自动生成的方法-idLastMessageFromServer
。此方法类似于:
- (NSString *)idLastMessageFromServer
{
return _idLastMessageFromServer;
}
- (void)setIdLastMessageFromServer:(NSString *)idLastMessageFromServer
{
if (_idLastMessageFromServer != idLastMessageFromServer) {
[_idLastMessageFromServer release];
_idLastMessageFromServer = idLastMessageFromServer;
[_idLastMessageFromServer retain];
}
}
- (void)dealloc
{
[_idLastMessageFromServer release];
[super dealloc];
}
self.idLastMessageFromServer
用于设置属性值时,会调用自动生成的方法-setIdLastMessageFromServer:
。此方法类似于:
- (NSString *)idLastMessageFromServer
{
return _idLastMessageFromServer;
}
- (void)setIdLastMessageFromServer:(NSString *)idLastMessageFromServer
{
if (_idLastMessageFromServer != idLastMessageFromServer) {
[_idLastMessageFromServer release];
_idLastMessageFromServer = idLastMessageFromServer;
[_idLastMessageFromServer retain];
}
}
- (void)dealloc
{
[_idLastMessageFromServer release];
[super dealloc];
}
最后一点注意事项:确保在-dealoc
方法中从服务器发布_idLastMessageFromServer。比如:
- (NSString *)idLastMessageFromServer
{
return _idLastMessageFromServer;
}
- (void)setIdLastMessageFromServer:(NSString *)idLastMessageFromServer
{
if (_idLastMessageFromServer != idLastMessageFromServer) {
[_idLastMessageFromServer release];
_idLastMessageFromServer = idLastMessageFromServer;
[_idLastMessageFromServer retain];
}
}
- (void)dealloc
{
[_idLastMessageFromServer release];
[super dealloc];
}
有关属性和IVAR的更多详细信息 属性(如self.idLastMessageFromServer)是处理getter和setter方法的简单方法。它们不能保存数据,因为它们是方法。ivar(如_idLastMessageFromServer)是指向内存中某个位置的指针。它们不能控制访问和维护状态,因为它们只是一个指针 属性和IVAR一起工作 行
@property(非原子,保留)NSString*idLastMessageFromServer
表示在我的实现中的某个地方,我的类将有一个属性idLastMessageFromServer的getter和setter
行@synthesis idLastMessageFromServer=\u idLastMessageFromServer
auto使用iVar\u idLastMessageFromServer为idLastMessageFromServer生成getter和setter方法
简言之,物业控制对iVar的访问;iVar是该属性的存储位置。您可能应该更正标题的拼写,以帮助人们搜索内存损坏。现在我要尝试一下,但如果您是对的,为什么会这样,因为当我@synthesis idLastMessageFromServer=\u idLastMessageFromServer_idLastMessageFromServer与self相同。idLastMessageFromServer是否相同?不,不相同。_idLastMessageFromServer是实际的指针,而self.idLastMessageFromServer是对某些代码进行保留的语法糖。我认为这类似于
if(nil!=\ux){[\ux release];}\ux=newValue;[保留]代码>谢谢@craigmj,但是如果对为什么使用有不同的解释,那么如果只使用属性(self.idLastMessage),为什么需要创建iVar?谢谢@craigmj,但是如果对为什么使用有不同的解释,那么为什么需要创建iVar,如果只使用属性(self.idLastMessage)。为什么需要声明'NSString*\u idLastMessageFromServer;`和@synthesis idLastMessageFromServer=\u idLastMessageFromServer因为不仅声明了@属性(非原子,retain)NSString*idLastMessageFromServer
better和@synthesisidlastmessagefromserver
而不使用iVar\u idLastMessageFromServer
。基本上,您有两种选择:要么使用iVar并在分配变量时手动保留和释放,要么使用为您执行所有这些操作的属性。酒店拥有优势或做这一切,但你必须始终如一,始终使用自己。访问属性时idLastMessageFromServer。此外,在您的情况下,该属性提供对idLastMessageFromServer的公共访问。在您的情况下,可能最好直接使用iVar,或者至少在.m中创建一个带有属性的私有类别,以避免将其公开。现在我将尝试使用它,但如果您是对的,为什么会这样做,因为当我@synthesis idLastMessageFromServer=\u idLastMessageFromServer_idLastMessageFromServer与self相同。idLastMessageFromServer是否相同?不,不是_idLastMessageFromServer是一个变量。self.idLastMessageFromServer是对-idLastMessageFromServer或-setIdLastMessageFromServer的方法调用:(请参阅)谢谢@Jeffery Thomas,但是如果对为什么使用有不同的解释_idLastMessageFromServer为什么需要创建iVar,如果只使用属性(self.idLastMessage)。为什么需要声明'NSString*\u idLastMessageFromServer;`和@synthesis idLastMessageFromServer=\u idLastMessageFromServer因为不仅声明了@属性(非原子,retain)NSString*idLastMessageFromServer
better和@synthesisidlastmessagefromserver
并且不要使用iVar\u idLastMessageFromServer
。我已经更新了关于属性和iVar的更多详细信息。嗨@Jeffery Thomas这些确实解决了我的头疼问题,但在dealloc方法中仍然有一个问题,我必须发送到release[self.idLastMessageFromSever release]
或[\u idlastmessagefromserver release]
为什么?请@Jeffery Thomas别丢下我一个人。:)