Функция работает даже после слива бассейна, пожалуйста, помогите - PullRequest
0 голосов
/ 18 августа 2010

мы добавляем объект в пул, и когда пул очищается, объекты удаляются из памяти, и если я не добавлю их в пул, они останутся в памяти и могут быть доступны после вызова пула метод слива. Что я сделал в своем коде, так это то, что я не добавил объект своего класса в пул и вызвал метод после того, как пул истощил, вот мой код

#import <Foundation/Foundation.h>

@interface Myclass : NSObject
{

}

-(void)fun;

@end

@implementation Myclass

-(void)fun
{       
    NSMutableArray *arr = [[NSMutableArray alloc]init];

    char ch[10];
    NSString *str;

    for(int i =0;i<3;i++)
    {           
        scanf("%s",ch);
        str = [NSString stringWithCString:ch];
        [arr addObject:str];
    }

    for(int i =0;i<3;i++)
    {           
        NSLog(@"The values of mutable array are: %@", [arr objectAtIndex:i]);           
    }
}

@end

int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    Myclass *obj = [[Myclass alloc]init];
        [obj fun];

    // insert code here...
    NSLog(@"\nEnter pool drain");
    [pool drain];
    [obj fun];
    return 0;
}

теперь, когда метод fun вызывается после слива пула, каждый раз, когда я добавляю значение в массив, я получаю сообщение об ошибке

NSautoreleaseNoPool (): объект 0x105a80 класса NSCFString автоматически освобожден без пула на месте - просто утечка Стек: (0x4dlf из ox3de442)

но даже после показа этого сообщения я продолжал добавлять данные в мой массив, он работал нормально, но каждый раз показывал вышеуказанное сообщение. Подскажите, пожалуйста, почему это так?

Также я хотел бы знать, есть ли у них какая-либо функция, с помощью которой мы можем очистить экран консоли, я попробовал ncurses.h, но не смог этого сделать.

Пожалуйста, помогите мне решить эти две проблемы

1 Ответ

0 голосов
/ 18 августа 2010

Вы не добавляете какие-либо свои объекты в пул автоматического выпуска. Когда он слит, он пуст. Чтобы добавить объекты в пул автоматического выпуска, вы должны автоматически освободить их. например в шутку

NSMutableArray *arr = [[[NSMutableArray alloc]init] autorelease];

В основном:

Myclass *obj = [[[Myclass alloc]init] autorelease];

С этими двумя модификациями вы увидите одно из двух:

  1. на втором [obj fun] после утечки вы можете получить исключение для отправки сообщения на объект dealloc'd.

  2. вам может повезти, и память для obj все еще не повреждена на втором [obj fun], и в этом случае вы должны увидеть сообщение, опубликованное в журнале консоли, в котором говорится, что arr будет просачиваться, потому что нет пула автоматического выпуска .

Редактировать после комментария

Это сообщение

NSautoreleaseNoPool (): объект 0x105a80 класса NSCFString автоматически освобожден без пула на месте - только утечка Стек: (0x4dlf из ox3de442)

происходит, потому что метод вызывается этой строкой:

str = [NSString stringWithCString:ch];

пытается поместить строку в пул автоматического выпуска, прежде чем вернуть ее вам. Однако вы уже слили единственный пул, который у вас когда-либо был, поэтому попытка не удалась Строка будет поэтому утечка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...