为啥要在 didSelectRowAtIndexPath 中重新定义 pListPath?

Posted

技术标签:

【中文标题】为啥要在 didSelectRowAtIndexPath 中重新定义 pListPath?【英文标题】:Why redefine pListPath in didSelectRowAtIndexPath?为什么要在 didSelectRowAtIndexPath 中重新定义 pListPath? 【发布时间】:2011-10-24 12:00:31 【问题描述】:

所以我已经阅读了大量关于 plist 以及如何保存到它们的 SO-questions,虽然我不知道,但为什么到目前为止我看到的 iPhone-Dev-Book 没有涵盖这个(他们都使用tableView 编辑功能),我设法通过将其复制到文档文件夹中来真正写入 plist,如下所示:

pListPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
pListPath = [pListPath stringByAppendingPathComponent:@"piggyBanks.plist"];
NSLog(@"Path: %@", pListPath);

// if the file does not exist yet, create it, and copy the plist data into it, that can be found in the bundle 
NSFileManager *fileManager = [NSFileManager defaultManager];

if (![fileManager fileExistsAtPath:pListPath]) 
    NSString *sourcePath = [[NSBundle mainBundle] pathForResource:@"piggyBanks" ofType:@"plist"];
    [fileManager copyItemAtPath:sourcePath toPath:pListPath error:nil]; 


// make the plist content available for usage
pListContent = [[NSMutableDictionary alloc] initWithContentsOfFile:pListPath];
NSLog(@"pListContent: %@", pListContent);

到目前为止一切都很好,但是现在,如果我想在用户点击 tableViewCell 时更改一些 plist 值(如果这很重要,这是一个自定义值),尽管 pListPathpListContent 和其他属性是定义的在 .h 中并在 .m 中合成,我必须在 didSelectRowAtIndexPath 中重新定义 pListPathpListContent,以便在那一刻知道路径。

谁能告诉我为什么?我的意思是,这很好,它有效,但我想知道,为什么它必须这样,或者我是否在其他地方犯了错误..

谢谢!

【问题讨论】:

【参考方案1】:

如果plistPath 是你的类的字符串属性,你需要这样分配它:

if (!self.pListPath)    

    NSString *newPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    newPath = [newPath stringByAppendingPathComponent:@"piggyBanks.plist"];
    self.pListPath = newPath;

然后,使用self.pListPath 而不是pListPath

您必须重新设置它,因为此时,pListPath 被分配给一个自动释放的字符串,当您再次需要它时该字符串已被删除。设置属性(假设属性被保留或复制)将为您保留字符串。

【讨论】:

您好,谢谢您的回复。我不确定,如果我得到它。我尝试了你的方式(你在第 4 行混合了一些东西,它应该是 = 之后的 newPath ),令人惊讶的是它有效。但是,如果我使用 self.pListPath 而不是类变量,它不是对象变量吗?我引入了像@property (nonatomic, copy) NSString *pListPath; 这样的pListPath,之前将它作为assign。我想我记得使用没有自我的其他类型。作为类变量.. 感谢您指出错字,我已经更新了答案。我不确定您对类和对象变量的含义是什么——这些并不是目标 C 中真正使用的术语。您希望路径是 instance variable 就是它的样子。通过自我访问它。只是意味着您通过访问器 - 对于设置器特别重要,因为它为您保留了变量。 嗯,我学会了就像有类变量和对象变量一样。 Class V. 对于特定类的每个对象都是相同的,而 Object Vs.类的每个对象都不同,尽管每个对象肯定都有这个变量。类比。只需通过 vars 名称调用,而 object Vs.像 self.varName 一样被调用,也许这让我很困惑..(我来自 C++ 背景,认为这也适用于 objC)。那么在 objC 中是不是反过来呢?对于类的每个对象,带有 self.varName 的所有内容都是相同的,而没有 self 的 varName。就像一个对象 V.? 不,在目标 C 中不一样。最接近您所谓的类变量的可能是目标 C 中的静态变量。我会在苹果开发者网站上查看目标 C 文档的介绍如果我是你,我不可能给你最好的答案!【参考方案2】:

我在目标 C 中搜索类变量,并通过各种文章找到了我的方式,直到我找到 thisblog/blogpost,它解释了自我。和_underscore 的东西真的很好! 我现在总是用下划线声明我的 Ivar,没有属性。效果很好。总而言之,为什么总是使用 self.yourPropertiesName,你正在调用一个方法(setter 和 getter)!与您调用的任何其他方法一样,您需要说出是谁在调用。

希望这对其他人也有帮助:)

【讨论】:

以上是关于为啥要在 didSelectRowAtIndexPath 中重新定义 pListPath?的主要内容,如果未能解决你的问题,请参考以下文章

为啥要在hibernate中使用关联?

为啥要在 PySpark 中导入熊猫?

为啥要在 UpdateAsync 上设置 CreationTime 和 CreatorUserId?

为啥要在 didSelectRowAtIndexPath 中重新定义 pListPath?

为啥我们要在 free() 释放内存后清空指针? [复制]

为啥要在 CAKeyframeAnimation 上使用 `keyTimes`、`timingFunctions` 或 `timingFunction`?