【问题标题】:iPhone SDK: How To Return NSString From Custom ClassiPhone SDK:如何从自定义类返回 NSString
【发布时间】:2013-01-19 10:25:48
【问题描述】:

我在下面有一个自定义类:

#import <Foundation/Foundation.h>

@interface NamesFix : NSObject

@property (nonatomic, copy) NSString *fixedName;

- (NSString *)fixName:(NSString *)name;

@end

实现文件:

#import "NamesFix.h"

@implementation NamesFix

@synthesize fixedName;

- (NSString *)fixName:(NSString *)name
{
    if ([name isEqualToString:@"Foo"])
    {
        self.fixedName = @"Bar";
    }
    else
    {
        self.fixedName = @"";
    }
    return self.fixedName;
}

当我通过以下方式访问我的自定义类时:

NamesFix *namesFix = [NamesFix alloc] init];
NSString *someString = @"Foo";

[namesFix fixName:someString];

NSLog(@"fixedName: %@", namesFix.fixedName];

fixedName 返回null。我哪里弄错了?

【问题讨论】:

  • 通常您想将NSString 属性声明为copy
  • 我将使用copy 而不是assign 是这样吗?
  • 是的 - 这是推荐的
  • 您的错误是您将分配用于目标 c 对象。这必须使用复制或强保留。您使用 assign 和 assign 只是将属性分配给分配后立即释放的变量。所以,如果你使用 strong、copy、retain,这应该可以正常工作。
  • namesFix.fixedName 正在访问该属性。这可以。您没有做的是将值分配给属性,而不是保留 IVAR。您应该 a) 在方法说明中将 self.fixedName 设置为 @"Bar" 或 b) 在该对象之外调用该方法时,分配一个指针以获取该方法的结果(因为现在,您有一个 return返回你想要的值但不返回任何东西的值

标签: objective-c xcode nsstring null return


【解决方案1】:

制作您的属性副本,这是字符串的推荐内存管理属性 (您可以使用 retain 代替,但 copy 可以保护您免受其他人传入 mutable 子类 NSMutableString 并在您不注意的情况下对其进行更改):

@property (nonatomic, copy) NSString *fixedName;

在您的实现中,使用此属性提供的 setter 方法:

self.fixedName = ...

代替

fixedName = ...

编辑

并且习惯性地使用return self.fixedString

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-08
    • 2011-07-26
    • 2011-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多