开发者

ObjctiveC yet another retain-copy-release error [duplicate]

This question already has answers here: 开发者_JAVA百科 Closed 11 years ago.

Possible Duplicate:

Objective C alloc/release error

When I try the code below it crashes with BAD_ACCESS if I release newString. What am I missing here?

As far as I know, when I use "copy" as an accessor I got the ownership of the object, so even should I release the other referencing pointer, retain count should still stay 1+, so that object should still be in memory?

P.S. This is a singleton class if it makes a difference.

.h file

NSString *originalString;
@property (nonatomic,copy) NSString *originalString;

.m file

@synthesize originalString;
...
NSString *newString = [[NSString alloc] init...];
self.originalString = newString;
[newString release];  //this lines makes it crash

I've also tried

self.originalString = [newString copy];

with no luck..


Have you tried using retain instead of copy?

http://wiki.cs.unh.edu/wiki/index.php/Objective_C_Property_Attributes#Setter_Semantics

I'm not really sure whether or not this would actually work if copying doesn't, but using retain instead of copy should cause the reference count to the string to increment by 1 when assigned to the property, bringing it up to 2 from the 1 it was when the string was alloced, so when you use [newString release]; on the line after the property assignment, the string should end up with reference count 1 and thus continue to exist.


[newString relase]; //this lines makes it crash

relase probably isn't the name of a method. Did you mean release?

Assuming the above was just a typographical error in your question, and not an error in your code, then your code is correct, and you'll need to provide more information about the error. Pasting the actual code of the method in question would be helpful in that case.


this code looks correct, are you sure the crash isn't somewhere else?


EDIT: as noted in the comments, NSString being immutable won't cause the copy to allocate a new object. I've edited the answer for the mutable case, just in case someone stumbles into this later and doesn't read the whole thing. Now back with our regular programming.


Don't know if this might be the problem, but note that, if you were using a mutable object like NSMutableString, with copy you would not increment the retain count, you would effectively create a new object, so what would happen:

NSMutableString* newString = [[NSMutableString alloc] init..]; // allocate a new mutable string
self.originalString=newString; // this will create yet another string object
// so at this point you have 2 string objects.

[newString relase];  //this will in fact dealloc the first object
// so now you have a new object stored in originalString, but the object pointed
// to by newString is no longer in memory.
// if you try to use newString here instead of self.originalString,
// it can indeed crash.

// after you release something, it's a good idea to set it to nil to
// avoid that kind of thing
newString = nil;


Have you tried just adding autorelease to your *newString init? Then just take out the manual release all together.

NSString *newString = [[NSString alloc] init...] autorelease];


You may consider to migrate your codes to Xcode 4.1 with ARC, then you would not need to worry about retain and release of objects.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜