为什么我要在方法中将局部变量声明为'static'?
喜欢:static NSString *cellIdentifier = @"Cell";
这是性能优势吗?
(我知道'静态'的作用;在C语境中)
这种语法是什么意思?[someObj release], someObj = nil;
两个陈述?
为什么我要再次分配 nil ?
“释放”不够吗?
我应该为我分配/拥有的所有对象执行此操作吗?或者只是查看对象?
为什么每个人都复制NSString,但保留其他对象(在属性声明中)? 是的,NSStrings可以更改,但其他对象也可以更改,对吧? 那么为什么'复制'只是NSString,而不是所有? 这只是一个防御性的公约吗?
我不应该释放常量的NSString吗?就像这里:NSString *CellIdentifier = @"Cell";
为什么不?编译器是否为我分配/解除分配?
在一些教程应用程序中,我观察了这些(使用IB构建):
属性(IBOutlet,具有相同的ivar名称):window, someLabel, someTextField, etc etc...
在dealloc方法中,尽管window
ivar被释放,但其他人则没有。
我的问题是:为什么?我不应该发布其他的ivars(标签,textField)吗?为什么不呢?
说,我有3个级联下拉列表。 我的意思是,根据第一个列表中选择的内容,填充第二个列表 并根据第二个列表中选择的内容,填充第三个列表。 哪些UI组件可以最好地反映出来? 如何在iPhone UI中显示下拉列表? 使用UIPicker的Tableview?我什么时候应该更新第2个,第3个列表? 或者只有三个有触摸事件的标签?
你能给我一些关于Core-Data的好例子教程吗? (不只是简单的数据获取和存储在1/2关系的2/3表上)
我怎么知道我的应用程序是否泄漏内存?有什么工具吗?
答案 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是一个很好的起点。
我怎么知道我的应用程序是否泄漏内存?有什么工具吗?
答案 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)
release
,我认为设置为nil更像是一个风格问题。特别是如果你在dealloc
,那么意外重用的可能性就不大了。@""
NSString文字在你的过程中持续存在 - 你不应该保留或释放它们。