Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone @property中的内存损坏_Iphone_Objective C_Ios_Ipad - Fatal编程技术网

Iphone @property中的内存损坏

Iphone @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

我有下一段代码,一个带有这个属性的iVar在它的class
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别丢下我一个人。:)