所以我认为这是一个内存问题,这里是代码:
- (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在调试时具有无效的摘要,并在运行时崩溃。 我怀疑我错过了保留或某事,有人可以帮忙吗?感谢。
答案 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);
。万岁现在已经给了该死的字符串......