Я хочу создать приложение для обучения людей использованию памяти (iOS) - PullRequest
0 голосов
/ 11 октября 2011

У нас много сотрудников, которые относительно плохо знакомы с программированием на iOS и управлением памятью в целом.Я хочу создать приложение с парой меток, показывающих счетчики и несколько кнопок для увеличения и уменьшения этих счетчиков.

Кто-нибудь уже знает что-нибудь, что сработает, или посоветуете, как это настроить, чтобы оно до меня дошло?У меня есть рабочая версия, но она, кажется, не работает так, как я думаю.

ViewController.h

#import <UIKit/UIKit.h>

@interface MemoryTestingViewController : UIViewController {
    UILabel *retainCount;
    UILabel *descLabel;
    UIButton *addRetain;
    UIButton *addRelease;
    UIButton *access;

    NSMutableString *myString;
}

@property (nonatomic, retain) IBOutlet UILabel *retainCount;
@property (nonatomic, retain) IBOutlet UILabel *descLabel;
@property (nonatomic, retain) IBOutlet UIButton *addRetain;
@property (nonatomic, retain) IBOutlet UIButton *addRelease;
@property (nonatomic, retain) IBOutlet UIButton *access;

@property (nonatomic, retain) NSMutableString *myString;

-(IBAction)pressedRetain:(id)sender;
-(IBAction)pressedRelease:(id)sender;
-(IBAction)pressedAccess:(id)sender;

@end



ViewController.m

-(IBAction)pressedAccess:(id)sender {

    descLabel.text = @"Accessing myString, did we crash";
    myString = [NSMutableString stringWithFormat:@"Accessing myString"];

    retainCount.text = [NSString stringWithFormat:@"%i", [myString retainCount]];
}

-(IBAction)pressedRetain:(id)sender {

    descLabel.text = @"Adding 1 to retain count for myString";
    [myString retain];

    retainCount.text = [NSString stringWithFormat:@"%i", [myString retainCount]];
}

-(IBAction)pressedRelease:(id)sender {

    descLabel.text = @"Adding 1 release to myString";
    [myString release];

    retainCount.text = [NSString stringWithFormat:@"%i", [myString retainCount]];

}

- (void)didReceiveMemoryWarning
{
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.
}

#pragma mark - View lifecycle


// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad
{
    // init our variable string
    myString = [[NSString alloc] init];
    descLabel.text = @"myString retain count after alloc/init";

    // fill our label with myString's retain count starting out
    retainCount.text = [NSString stringWithFormat:@"%i", [myString retainCount]];
    [super viewDidLoad];
}

Когда это работает, кажется, что все в порядке, но вылетает всякий раз, когда я пытаюсь нажать кнопку сохранения.Если у кого-нибудь есть какой-нибудь совет, как это немного почистить, я был бы признателен.В идеале я хотел бы, чтобы они нажимали кнопку доступа, когда счет сохранения достигает нуля, и происходит сбой приложения, но кнопка доступа должна работать до тех пор, пока счет сохранения равен 1 или лучше.Спасибо.

Ответы [ 2 ]

4 голосов
/ 11 октября 2011

retainCount объекта - сложное дело.

Если вы продолжите идти по этому пути, вы должны знать о следующих деталях:

  • retainCount никогда не вернется 0
  • обмен сообщениями с висящим указателем не гарантирует сбой
  • сохранение количества не может быть известно после прохождения объекта через любой системный API из-за деталей реализации
  • любой подкласс любого системного класса может иметь неизвестное число сохранений из-за деталей реализации
  • сохранение количества никогда не отражает, был ли объект автоматически освобожден
  • autoreleases эффективно зависит от потока, в то время как счетчик сохранения является глобальным потоком
  • некоторые классы иногда реализуются с помощью синглетов (NSString, определенные значения NSNumber)
  • детали реализации меняются от платформы к платформе и выпускаются к выпуску
  • попытка swizzle retain / release / autorelease не будет работать, так как некоторые классы на самом деле не используют эти методы для сохранения счетчика (детали реализации, изменения для платформы / выпуска и т. Д.)

Если вы собираетесь учить удержанию / освобождению, вам следует рассматривать счет удержания как дельту и полностью сосредоточиться на «Если вы увеличиваете RC, вы должны уменьшить его».

3 голосов
/ 11 октября 2011

retainCount общеизвестно ненадежен, и возвращаемые значения могут быть очень странными. Проверьте этот пост из:

...