Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 为什么NSString属性更改为无效值?_Iphone_Objective C_Cocoa_Cocoa Touch - Fatal编程技术网

Iphone 为什么NSString属性更改为无效值?

Iphone 为什么NSString属性更改为无效值?,iphone,objective-c,cocoa,cocoa-touch,Iphone,Objective C,Cocoa,Cocoa Touch,当我在viewDidLoad和ViewWillDisplay之间移动时,我有一个属性变为无效。我不知道为什么会这样 我有一个helper类,它获取数据库的路径。我在app委托中分配了这个类。RootViewController获取对appDelegate的引用,如下所示: //inside .h file @interface RootViewController : UITableViewController <UITableViewDelegate, UITableViewDataSo

当我在viewDidLoad和ViewWillDisplay之间移动时,我有一个属性变为无效。我不知道为什么会这样

我有一个helper类,它获取数据库的路径。我在app委托中分配了这个类。RootViewController获取对appDelegate的引用,如下所示:

//inside .h file
@interface RootViewController : UITableViewController
<UITableViewDelegate, UITableViewDataSource>{
NSArray *controllers;
myAppDelegate *appDelegate;
}

//inside .m file
@implementation RootViewController
@synthesize controllers;

- (void)viewDidLoad {
appDelegate = [[UIApplication sharedApplication] delegate]; 

self.controllers = appDelegate.topicControllers;
[super viewDidLoad];
}
databasePath被声明为NSString。为什么更改为NSPathStore2

当我在调试器中继续时,发生了一些其他奇怪的事情。一旦我进入ViewWill,属性值将变为“无效”,类型将返回NSString。虽然我甚至在那里看到过UIButton

为什么会变为无效?我不能再使用这个变量了

- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated]; //changes before this line executes
}
我不会在viewDidLoad和ViewWillDisplay之间执行任何操作。以下是在databaseHelper类中分配databasePath的方式,该类在ApplicationIDFinishLaunching之前发生:

- (NSString *) getDBPath {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);
NSString *documentsDir = [paths objectAtIndex:0];
return [documentsDir stringByAppendingPathComponent:self.databaseName];
}
stringByAppendingPathComponent返回NSString。为什么我要在任务结束后的某个时候获得NSStorePath2


我现在一切正常,只是调用[databaseHelper getDBpath]。我的目标是节省一些cpu周期并存储该值。因此,数据库路径。有任何关于为什么数据库路径更改为无效的建议吗?

我相信您指的是NSPathStore2,而不是NSStorePath

NSPathStore2位于NSString的内部私有子类中,该子类在子系统中使用,已知该字符串是文件系统路径。它在功能上与NSString在所有您关心的方面都是等效的


从你的帖子中不清楚除了想知道那个类是什么,以及缓存它是否有任何优化之外,你是否还有其他问题。答案可能不是:在访问数据库时使用CPU周期的所有事情中,对其文件系统路径的访问可能是列表中的最后一个。

因为您没有保留该值。查看中的规则,查看何时需要保留某些内容


当然,正如cdespinosa所指出的,您可能不需要首先缓存这个路径名。这可能不是一个大的性能杀手。首先分析,然后优化热点。

我不明白你的最后一段,也不明白你为什么认为自己的价值变成无效价值不是问题。我编辑了这篇文章,希望能更清楚。不知道为什么会有-1票,但没有变成无效票。它没有变成什么。“NSPathStore2是NSString的内部私有子类”-即,该对象是NSString。它不是NSString的直接实例;它是一个子类的实例,这已经足够好了。就像对待任何其他NSString一样对待它。问题是我希望在databaePath中有一个路径。但是,当使用路径时,会得到一个值“invalid”。无论出于何种原因,路径值消失了。您不断给出NSString和NSPathStore2的定义,这不是我要问的。实际上,NSPathStore2正是您要问的。至于为什么会变为无效,您应该阅读内存管理文档。(是的,现在我看到关于它变为无效的部分在你的问题中,但是它被隐藏起来了,与你标题中的问题无关。)为什么投了反对票?这是一个更好的问题,而不是一个很好的问题,收到大量的选票!当databasePath的实现尚未显示时,您如何推断我没有保留?以下是实现:@property(非原子,retain)NSString*databasePath;因为这就是导致这种症状的原因。要么您的对象死亡(因为您没有保留它),要么您用另一个对象替换它(并且没有保留它)。或者你过度发布了它,但这不太可能。至于@property:您是在实际使用该属性,还是直接分配给ivar?>>…或者直接分配给ivar?self.databasePath是属性访问语法;编译器将“self.databasePath=foo”转换为“[self-setDatabasePath:foo]”——对访问器方法的调用。访问者释放旧值并保留新值。谢谢。没有自我,它是如何翻译的?
- (NSString *) getDBPath {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);
NSString *documentsDir = [paths objectAtIndex:0];
return [documentsDir stringByAppendingPathComponent:self.databaseName];
}