- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我编写的代码越多,迷失的就越多...因此我决定为我(和其他人)创建一个完全致力于内存管理的主题,而不是浪费时间来理解 obj-c 基础知识...我会当提出新问题时更新它!
好的,下面是一些示例:
// myArray is property (retain)
myArray = otherArray;
//myArray isn't a property
myArray = otherArray;
//myArray is a property (retain)
myArray = [[NSArray alloc] init];
//myArray isn't a property
myArray = [[NSArray alloc] init];
--- 所以,如果我理解......当你放置 self.myArray 时,你告诉 Xcode 使用 getter 或 setter,但是当你只执行 myArray 时,你要对一切负责,对吗?
[已解决] UPDATE1:之间有区别吗:
//myArray is a property
myArray = otherArray; // it is only a reference, releasing otherArray will imply releasing myArray
self.myArray = otherArray; // otherArray is sent a retain message so releasing otherArray will still keep myArray in memory
--- 是的,有区别(参见上面的评论)
[已解决]更新2:下面的 myArray 是否等于 nil ?
NSArray *myArray;
--- Kubi:是的,它等于 nil。
[已解决] UPDATE3:它算作 2 次保留吗?一种从 self 保留,一种从 alloc 保留?这是内存泄漏吗?
self.myArray = [[NSArray alloc] init];
--- Kubi:是的,这是内存泄漏!
[已解决]更新4:属性(property)负责一切?不需要分配或释放?
self.myArray = [NSArray array];
--- 我们这里使用 setter 以便正确保留数组
[已解决]更新5:这两个 block 相同吗?
//myArray is a retained property
self.myArray = [NSArray array]; //retain
self.myArray = nil; //release and set to nil
myArray = [[NSArray alloc] initWithArray]; //retain
self.myArray = nil; //release and set to nil
--- Kubi:是的,它们是相同的
感谢您抽出时间。
戈蒂耶。
最佳答案
首先,我假设您有一个名为 myArray
的属性和一个名为 myArray
的 iVar?如果是这样,情况 1,2 是相同的,并且 3,4 是相同的。如果您需要设置当前类的属性,则必须通过以下方法之一来完成:
self.myArray = otherArray;
[self setMyArray:otherArray];
行 myArray = otherArray
只会设置 iVar,而不会设置属性。
第二部分,您询问内存管理。第一步:阅读Apple's Guide 。这确实是必读的。如果您不完全理解,请不要担心,每月继续阅读一次,它最终会变得清晰。
第二步:记住这条经验法则:如果您分配
、复制
、新建
或保留
一个对象,你有责任释放该对象,如果你不释放,它就会被泄漏。
在所有其他情况下,您不负责释放该对象,但它最终会被释放。如果您需要保留它,则需要保留
它(当然,稍后再释放它)。
回到您的示例,在前两种情况下,如果您不保留 myArray
,它将在此代码块之后的某个时刻释放。如果您稍后尝试向该对象发送消息,则会收到错误消息。在后两种情况下,如果您在某个时刻不释放 myArray
对象,它将被泄漏。
更新 1差别很大。这两行完全不同。关于点语法要认识到的重要一点是这两行完全等效:
self.myArray = otherArray;
[self setMyArray:otherArray];
注意第二行是方法调用。理论上你可以在该方法中放入任何你想要的东西。您可以将 myArray
设置为 nil,或将其设置为 someOtherArray
,或者更新 twitter 或其他内容。
更新2是的,Obj-C 中的指针被初始化为 nil。
<小时/>更新3确切地。如果 myArray
属性声明为 retain
并且您使用默认合成器,则会导致内存泄漏。
更新5也完全正确。
关于iphone - 保留、分配、属性...让您的 Obj-c 生活更轻松的主题!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2496477/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!