Why copy mutableRet when you just release it anyway? Instead, just return it with an autorelease:
I do that because i return an immutable array. I always try to return the types i promise to return in the declaration :)

To Kyle:
I looked at the - intoArray:addItemFromTable:usingStatement:andSearchString:, but i failed to find anything bad in there. Here is the code:

- (void) intoArray:(NSMutableArray *)mutableRet addItemFromTable: (NSString *)table usingStatement:(sqlite3_stmt *)statement andSearchString:(NSString *) searchString {
        
sqlite3_bind_text(statement, 1, [searchString cStringUsingEncoding:NSUTF8StringEncoding], -1, SQLITE_TRANSIENT);
        
        while (sqlite3_step(statement) == SQLITE_ROW) {
NSString *s = [NSString stringWithUTF8String:(char *) sqlite3_column_text(statement, 0)];
                int wid = sqlite3_column_int(statement, 1);
[mutableRet addObject:[WordIdAndDatabase makeWithId:wid word:s andDatabaseName:table]];
        }
}

And here is some more detailed description of the problem. The thing is that i have a class called "Database" which is responsible for communicating with my database. The Database class is controlled by a DatabaseManager, which is a singleton... Any object in my application wanting to get anything from the db calls the [DatabaseManager sharedManager] and calls the methods it needs to call.

As I may have mentioned before, the app I am writing is a dictionary. The user interface has an NSTableView and an NSTextField. As the user types a searchword into the textfield, the app creates new NSOperations that select the words beginning with the chars the user has typed, from the database, and then i show them in the table view. Again, all the interactions with the db are executed via the DatabaseManager.

When the user hits enter or clicks on a cell with a word in it, we select that word with the equivalent from the db and display that in a different window.

And the thing is that when the NSLog line we talked above is not there, the -selectWordsBeginningWith: method works fine only until the user presses Enter or clicks a cell, i.e. until we get another class connect to the database.

Again, with NSLog in place, it all works fine no mater how many translations you open...

I would be really grateful for any hints to what the cause might be.




On Apr 29, 2009, at 4:32 PM, Graham Cox wrote:


On 29/04/2009, at 10:05 PM, Тимофей Даньшин wrote:

        NSArray *ret = [mutableRet copy];
//      NSLog(@"The number of items to be returned is: %i", [ret count]);
        [mutableRet release];
        return ret;


I don't see why your NSLog line should cause a problem, but your memory management at the end of the function is wrong, so may have a bearing on it.

Why copy mutableRet when you just release it anyway? Instead, just return it with an autorelease:

return [mutableRet autorelease];

There is no need to copy a mutable array just so you can return it as a non-mutable array - it is an array and its mutability is invisible to the client of this code. As it stands you're leaking the copy because it is never released.

--Graham



_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to