ivar не будет отвечать на метод NSMutableString - PullRequest
0 голосов
/ 26 октября 2011
#import <Foundation/Foundation.h>

@interface Engine : NSObject {
    NSMutableString *mutableName;
}

@property (assign)  NSMutableString *mutableName;

@end

Почему мой ивар engine.name не работает с этим простым NSMutableString методом?mutableName является NSMutableString и было правильно реализовано с @property и @synthesize.

#import "Engine.h"
#import <Foundation/Foundation.h>

int main (int argc, const char * argv[])
{

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    Engine *engine = [[Engine alloc]init];


  #import "Engine.h"
#import <Foundation/Foundation.h>

int main (int argc, const char * argv[])
{

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
Engine *engine = [[Engine alloc]init];

engine.mutableName = @"Jones";
[engine.mutableName insertString:@"Mrs." atIndex:0];
NSLog(@"Full name is %@", engine.mutableName);

}

    [pool drain];
    return 0;
}

#import "Engine.h"

@implementation Engine

@synthesize mutableName;

@end

#import "Engine.h"
#import <Foundation/Foundation.h>

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

    engine.mutableName = @"Jones";
    [engine.mutableName insertString:@"Mrs." atIndex:0];
    NSLog(@"Full name is %@", name);

    [pool drain];
    return 0;
}

1 Ответ

1 голос
/ 26 октября 2011

Вы не показали свой код, но я подозреваю, что вы сделали, объявили свойства name и mutableName и реализовали их для использования того же самого ивара под капотом. В этом случае ваше свойство mutableName, объявленное как NSMutableString, фактически возвращает NSString, которое было присвоено свойству name. Если это то, что вы делаете, и вы действительно хотите, чтобы это работало таким образом, то вам нужно изменить свои name аксессоры так, чтобы они выглядели следующим образом (при условии, что _name является резервным ivar):

- (NSString *)name {
    return [[_name copy] autorelease]; // take a snapshot of the string
}
- (void)setName:(NSString *)name {
    [_name release];
    _name = [_name mutableCopy];
}

Таким образом, строка сохраняется как изменяемая под капотом, но возвращается как неизменная строка при использовании средства доступа name.

...