Утечка памяти вызывает сбой здесь, или другие проблемы реализации класса? - PullRequest
0 голосов
/ 17 февраля 2012

//////////////////// Mutation.h

#import <Foundation/Foundation.h>
@interface Mutation : NSObject
@property (assign) NSString *inputString;
@property (assign) NSString *outputString;    
@end

//////////////////// Mutation.m

#import "Mutation.h"
@implementation Mutation
@synthesize inputString;
@synthesize outputString;
@end

//////////////////// NTAppDelegate.h

#import <Cocoa/Cocoa.h>
#import "Mutation.h"
@interface NTAppDelegate : NSObject <NSApplicationDelegate>
@property (assign) IBOutlet NSWindow *window;
@property (weak) IBOutlet NSTextField *dataField;
@property (weak) IBOutlet NSTextField *outputField;
@property (assign) Mutation *mutation;
- (IBAction)receiveUserTextFromTextField:(NSTextField *)sender;
@end

//////////////////// NTAppDelegate.m

#import "NTAppDelegate.h"
#import "Mutation.h"
@implementation NTAppDelegate
@synthesize window = _window;
@synthesize dataField = _dataField;
@synthesize outputField = _outputField;
@synthesize mutation = mutation;    //statement #1

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification //#3 (block)
{
Mutation *aMutation = [[Mutation alloc] init];
[self setMutation:aMutation];
[aMutation setInputString:@"new"];
[aMutation setOutputString:@"old"];
NSLog(@"Mutation inputString is %@; outputString is %@", [aMutation inputString], [aMutation outputString]);    
}

- (IBAction)receiveUserTextFromTextField:(NSTextField *)sender   //#2 (block)
{
// assign the user's entered text to Mutation's inputString
NSString* newText = [sender stringValue];   // -stringValue inherited from NSControl
NSLog (@"%@ was entered", newText);         //  <-THIS WORKS
[mutation setInputString:newText];           //  <-CRASH  statement #4 (crashes)
NSLog(@"Mutation(2) inputString is %@; outputString is %@", [aMutation inputString], [aMutation outputString]);    
}

@end

/////// Я использую ARC. Попытка индуктивно получить представление об основах objC. Это продолжение моего первого вопроса ...

Мои конкретные вопросы относятся к пронумерованным строкам / блокам кода (# 1- # 4) выше.

1 это создание экземпляра мутации, которая является глобальной?

2 мне нужно передать ссылку на эту мутацию здесь? и если это так, введя другой аргумент в функцию?

3 Я не понимаю, почему при сборке и запуске ведение журнала происходит сначала из блока № 3, затем из блока № 2

4, почему происходит сбой этой строки (в журнале указано, что селектор отменен)

Вход

при загрузке программы, записи в журнале, в порядке:

а) здесь идут данные пользователя ... введено

b) Мутация (2) inputString is (null); outputString равен (null)

в) Мутация inputString является новой; outputString старая

тогда, если пользователь вводит данные (оператор № 4): плохие вещи случаются.

1 Ответ

1 голос
/ 17 февраля 2012
  1. @synthesize сгенерирует для вас ivar mutation, -mutation и -setMutation:, не более того.Создание экземпляра выполняется в alloc и init.
  2. Да и Нет. Вы должны прояснить свой код, на какую мутацию вы ссылались, методом ivar / accessor, а не другим аргументом.После изменения подписи метод больше не существует, как прежде.
  3. Вы ошиблись, указав свой @property (assign) Mutation *mutation.Делегат приложения является владельцем ivar mutation и, следовательно, несет ответственность за его сохранение.Вам нужно @property (strong) Mutation *mutation.
  4. Вы определили mutation как слабый ивар, поэтому сеттер -setMutation: не удержит его, и он был освобожден, когда закончится блок # 3.Когда достигается # 4, мутация освобождается, и адрес, на который указывает ивар, вероятно, назначается другим экземплярам объекта, что явно не является Mutation, поэтому произошла ошибка.
...