0
#import <Foundation/Foundation.h>

@interface Engine : NSObject {
    NSMutableString *mutableName;
}

@property (assign)  NSMutableString *mutableName;

@end

なぜ私のivarは、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;
}
4

1 に答える 1

1

コードを表示していませんが、あなたが行ったことはnamemutableNameプロパティの両方を宣言し、内部で同じ ivar を使用するように実装したと思われます。この場合、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このようにして、文字列はフードの下で可変として保持されますが、アクセサーを使用すると不変の文字列として返されます。

于 2011-10-26T18:16:39.493 に答える