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

标签 iphone objective-c cocoa cocoa-touch

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

我有一个帮助程序类可以获取我的数据库的路径。我在应用程序委托(delegate)中分配此类。 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];
}

我将鼠标悬停在 appDelegate 上以查找数据库助手类和包含数据库路径的属性:

NSPathStore2 * appDelegate.databaseHeper.databasePath  "/Users/userA/Library/Application Support/iPhone Simulator/User/Applications..."

databasePath 被声明为一个 NSString。为什么它变成了 NSPathStore2?

当我在调试器中继续操作时,发生了一些其他奇怪的事情。一旦进入 viewWillAppear,属性值变为“无效”并且类型返回到 NSString。尽管我什至在那里见过 UIButton。

为什么会变为invalid?我不能再使用该变量。

- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated]; //changes before this line executes
}

我在 viewDidLoad 和 viewWillAppear 之间没有做任何事情。这是在 databaseHelper 类中分配 databasePath 的方式,它发生在较早的 applicationDidFinishLaunching 上:

- (NSString *) getDBPath {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);
NSString *documentsDir = [paths objectAtIndex:0];
return [documentsDir stringByAppendingPathComponent:self.databaseName];
}

stringByAppendingPathComponent 返回一个 NSString。为什么我在分配后的某个时候会得到一个 NSStorePath2?

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

最佳答案

因为你没有保留值。查看 Memory Management Programming Guide 中的规则查看何时需要保留某些内容。

当然,正如 cdespinosa 指出的那样,您可能一开始就不需要缓存此路径名。它可能不是一个很大的性能 killer 。首先分析,然后优化热点。

关于iphone - 为什么 NSString 属性更改为无效值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/717385/

相关文章:

ios - 从 uicollectionciewcell 中的 uitextfield 更新和获取文本

iphone - iPhone应用程序何时收到didChangeAuthorization Status : delegate call?

objective-c - 类组合在 iOS 中是如何工作的?

cocoa - OpenGL 几何着色器 Mac OS X

iphone - 单元格处于编辑模式时如何显示披露指示符?

ios - SceneKit 支持的 OpenGL ES 3.0 子集是什么?

iphone - 无法在委托(delegate)方法中更改 UIButton 文本颜色

objective-c - map 查看 :didAddAnnotationViews: doesn't respond

objective-c - 如何在 Cocoa Objective-c 中创建 UI 标签?

iphone - 如何在 Safari 中打开 UIWebview 中的链接