I have the following method
-(NSMutableArray *) getPaises {
NSMutableArray * paises;
paises = [[NSMutableArray alloc] init];
while( get new row ) {
NSString *aPais = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 0)];
[paises addObject:aPais];
}
return paises;
}
I am not releasing the aPais, because if I do it the application crashes. I don't know when or if whether I should release it somewhere after using it and, if so, how do I do it. Just release the NSMutableArray is enough? Or do I have to traverse it and release each object?
And if I don't have to release it, who is the responsible for releasing?
A static, plain-text Unicode string object which you use when you need reference semantics or other Foundation-specific behavior.
The Swift string is one character long, as expected. The NSString says it has a length of seven — this matches with the length of the Swift string's utf16 view, since NSStrings are backed by UTF-16: 09:02 The Swift string's unicodeScalars view returns a count of four.
(NSString *) is simply the type of the argument - a string object, which is the NSString class in Cocoa. In Objective-C you're always dealing with object references (pointers), so the "*" indicates that the argument is a reference to an NSString object.
Once a string has been initialized using NSString, the only way to append text to the string is to create a new NSString object. While doing so, you can append string constants, NSString objects, and other values.
As epatel said, you don't need to release that particular string. If you wanted to be more proactive, you could do this instead:
-(NSMutableArray *) getPaises {
NSMutableArray * paises;
paises = [[[NSMutableArray alloc] init] autorelease];
while( get new row ) {
NSString *aPais = [[NSString alloc] initWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 0)];
[paises addObject:aPais];
[aPais release];
}
return paises;
}
In summary:
[[NSString alloc] initWith...] -> You must release or autorelease.
[NSString stringWith...] -> No need to release.
-- Edit: Added autorelease
for paises, as you are returning it. When you return an object, always autorelease it if you have alloc&init'd it.
stringWithUTF8String:
returns an autorelease string which will be released automatically by Cocoa in the next eventloop. But the string is also retained in the array when you do addObject:
...so as long as it is in the array it will be retained.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With