很少有iPhone noob问题

时间:2010-05-10 11:26:15

标签: objective-c iphone cocoa

  1. 为什么我要在方法中将局部变量声明为'static'? 喜欢:static NSString *cellIdentifier = @"Cell"; 这是性能优势吗? (我知道'静态'的作用;在C语境中)

  2. 这种语法是什么意思?[someObj release], someObj = nil; 两个陈述? 为什么我要再次分配 nil ? “释放”不够吗? 我应该为我分配/拥有的所有对象执行此操作吗?或者只是查看对象?

  3. 为什么每个人都复制NSString,但保留其他对象(在属性声明中)? 是的,NSStrings可以更改,但其他对象也可以更改,对吧? 那么为什么'复制'只是NSString,而不是所有? 这只是一个防御性的公约吗?

  4. 我不应该释放常量的NSString吗?就像这里:NSString *CellIdentifier = @"Cell"; 为什么不?编译器是否为我分配/解除分配?

  5. 在一些教程应用程序中,我观察了这些(使用IB构建): 属性(IBOutlet,具有相同的ivar名称):window, someLabel, someTextField, etc etc... 在dealloc方法中,尽管window ivar被释放,但其他人则没有。 我的问题是:为什么?我不应该发布其他的ivars(标签,textField)吗?为什么不呢?

  6. 说,我有3个级联下拉列表。 我的意思是,根据第一个列表中选择的内容,填充第二个列表 并根据第二个列表中选择的内容,填充第三个列表。 哪些UI组件可以最好地反映出来? 如何在iPhone UI中显示下拉列表? 使用UIPicker的Tableview?我什么时候应该更新第2个,第3个列表? 或者只有三个有触摸事件的标签?

  7. 你能给我一些关于Core-Data的好例子教程吗? (不只是简单的数据获取和存储在1/2关系的2/3表上)

  8. 我怎么知道我的应用程序是否泄漏内存?有什么工具吗?

4 个答案:

答案 0 :(得分:5)

  

为什么我应该在方法中将局部变量声明为'static'?喜欢:static NSString * cellIdentifier = @“Cell”;这是性能优势吗? (我知道'静态'的作用;在C语境中)

静态在Objective-C中与在正常C中相同。

  

这种语法是什么意思?[someObj release],someObj = nil;两个陈述?我为什么要再分配nil? “释放”不够吗?我应该为我分配/拥有的所有对象执行此操作吗?或者只是查看对象?

这取决于具体情况。它停止有任何过度释放对象的可能性,因为后续释放消息将被发送到nil。

  

为什么每个人都复制NSString,但保留其他对象(在属性声明中)?是的,NSStrings可以更改,但其他对象也可以更改,对吧?那么为什么'复制'只是NSString,而不是所有?这只是一个防御性的会议吗?

NSStrings无法更改,但NSMutableStrings(子类)可以。是的,这是一个防御性的会议。

  

我不应该发布常量NSString吗?像这里:NSString * CellIdentifier = @“Cell”;为什么不?编译器是否为我分配/解除分配?

阅读Cocoa Memory Management Rules。你是通过alloc,copy还是new获得常量字符串?不,你没有。因此,除非您先保留它,否则不要释放它。保留不变的字符串不会有害。

  

在一些教程应用程序中,我观察了这些(使用IB构建):属性(IBOutlet,具有相同的ivar名称):window,someLabel,someTextField等等...在dealloc方法中,尽管窗口ivar已被释放,其他不是。我的问题是:为什么?我不应该发布其他的ivars(标签,textField)吗?为什么不呢?

同样,内存管理指南也会有所帮助。如果对象保留了ivar(或者使用alloc,copy等创建了它),则需要释放它。

  

说,我有3个级联下拉列表。我的意思是,根据第一个列表中选择的内容,填充第二个列表,并根据第二个列表中选择的内容,填充第三个列表。哪些UI组件可以最好地反映出来?如何在iPhone UI中显示下拉列表?使用UIPicker的Tableview?我什么时候应该更新第2个,第3个列表?或者只有三个有触摸事件的标签?

传递。我不在iPhone上进行UI编程。

  

你能给我一些关于Core-Data的好例子教程吗? (不仅仅是简单的数据获取和存储在1/2关系的2/3表上)

Apple'as Core Data Programming docs是一个很好的起点。

  

我怎么知道我的应用程序是否泄漏内存?有什么工具吗?

尝试http://developer.apple.com/iphone/library/documentation/Performance/Conceptual/ManagingMemory/Articles/FindingLeaks.html

答案 1 :(得分:1)

<强> 2。这个语法是什么意思?[someObj release],someObj = nil;两个陈述?我为什么要再分配nil? “释放”不够吗?我应该为我分配/拥有的所有对象执行此操作吗?或者只是查看对象?

如果您只是释放一个对象,那么它将成为释放对象。如果您尝试对释放的对象执行任何类型的操作,那么您的应用程序崩溃。为避免此类事故,始终首选“在释放后将对象指定为零”因为我们都知道在nil上执行的任何操作都不会被执行:)

4.我不应该发布常量NSString吗?像这里:NSString * CellIdentifier = @“Cell”;为什么不?编译器是否为我分配/解除分配?

对象所有权在这里出现。我们必须在obj-C中学习的第一个基本步骤是对象所有权。 如果您分配,保留,复制,则必须释放。

NSString * CellIdentifier = @“Cell”; 在这里你根本没有分配它然后为什么你想要发布它?

<强> 6。说,我有3个级联下拉列表。我的意思是,根据第一个列表中选择的内容,填充第二个列表,并根据第二个列表中选择的内容,填充第三个列表。哪些UI组件可以最好地反映出来?如何在iPhone UI中显示下拉列表?使用UIPicker的Tableview?我什么时候应该更新第2个,第3个列表?或者只有三个有触摸事件的标签?

导航控制器适用于此类需求。不是吗?

<强> 8。我怎么知道我的应用程序是否泄漏内存?有什么工具吗?

<强>泄漏

答案 2 :(得分:1)

5。我不应该发布其他的ivars(标签,textField)吗?

你能展示完整的声明吗?您知道,当您声明属性时,您可以指定它是否应该是具有或不具有retain的赋值(assign vs retain)。如果它是没有保留的作业,那么发布将是错误的。

@property (retain) IBOutlet NSWindow window;  //<--- must release
@property (assign) IBOutlet NSWindow window;  //<--- must not release

如果您指定时没有保留,则可以在您不知情的情况下释放该对象。

6。 3个级联下拉列表

选择器视图可以处理多级选择。结帐

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView

告诉您需要多少组件,然后使用

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component

根据首先选择的内容更改第二个组件中显示的内容。

答案 3 :(得分:0)

  1. 正如Toon所说,使用与C一样。
  2. 我通常只是release,我认为设置为nil更像是一个风格问题。特别是如果你在dealloc,那么意外重用的可能性就不大了。
  3. NSStrings可以是NSMutableString的实例 - 副本通常更安全。您可以将副本用于其他类,它们在概念上是“值对象”并实现NSCopying。
  4. @"" NSString文字在你的过程中持续存在 - 你不应该保留或释放它们。
  5. 查看Apple文档here
  6. 听起来像多个UITableViews。是否要求一次将它们全部放在屏幕上?
  7. 我发现学习核心数据的最佳方法是用它编写一个应用程序。