如何在Objective C中返回NSString *(继续获取无效摘要)

时间:2012-02-13 04:06:10

标签: objective-c memory-management nsstring

所以我认为这是一个内存问题,这里是代码:

- (NSString *)giveMeAStringGoddammit
{  
  NSString *s;
  // switch statement to choose which string to assign to s, so essentially:
  s = @"a string";      
  return s;  
}

调用代码:

NSString *aString;
aString = [self giveMeAStringGoddammit];

然而,在此调用之后,aString在调试时具有无效的摘要,并在运行时崩溃。 我怀疑我错过了保留或某事,有人可以帮忙吗?感谢。

2 个答案:

答案 0 :(得分:3)

你得到的东西很好:

#import <Foundation/Foundation.h>

@interface Test : NSObject
- (NSString *)giveMeAStringGoddammit;
@end

@implementation Test
- (NSString *)giveMeAStringGoddammit
{  
    NSString *s;
    // switch statement to choose which string to assign to s, so essentially:
    s = @"a string";      
    return s;  
}
@end

int main (int argc, const char * argv[])
{
    @autoreleasepool {
        Test *t = [[Test alloc] init];
        NSLog(@"t says: %@", [t giveMeAStringGoddammit]);
    }
    return 0;
}

该程序的输出是:

t says: a string

为了使这更加真实,让我们改变它以使用属性:

#import <Foundation/Foundation.h>

@interface Test : NSObject
@property(copy, nonatomic) NSString *string;
- (NSString *)giveMeAStringGoddammit;
@end

@implementation Test
@synthesize string;
- (NSString *)giveMeAStringGoddammit
{  
    NSString *s;
    // switch statement to choose which string to assign to s, so essentially:
    s = self.string;
    return s;  
}
@end

int main (int argc, const char * argv[])
{
    @autoreleasepool {
        Test *t = [[Test alloc] init];
        t.string = @"Hello world!";
        NSLog(@"t says: %@", [t giveMeAStringGoddammit]);
    }
    return 0;
}

这就是你所期望的:

t says: Hello world!

答案 1 :(得分:0)

你已经创建了一个指针对象,并且每当你引用它时它都会增加它的保留计数,为了增加保留计数,应该启动字符串并分配内存,否则你可以使用 [NSString stringwithString: [self giveMeAStringGoddammit] 。只有在本地需要它时才能使用此定义。因为无论何时尝试将其引用到一边,自动释放池都会使应用程序崩溃(因此不会手动保留)。因此,如果您需要在函数外部使用它,最好使用 [NSString alloc] init] ,然后将字符串加载到指针对象。
让你的代码工作的方法就是添加行NSString *aString = [NSString stringWithString:[self giveMeAStringGoddammit]]; NSLog(@"My Str:%@",aString);。万岁现在已经给了该死的字符串......