代码之家  ›  专栏  ›  技术社区  ›  mshsayem

很少有iPhone Noob问题[已关闭]

  •  1
  • mshsayem  · 技术社区  · 14 年前
    1. 为什么要在方法内将局部变量声明为“static”? 像: static NSString *cellIdentifier = @"Cell"; 它是性能优势吗? (我知道“静态”的作用;在C上下文中)

    2. 这个语法是什么意思? [someObj release], someObj = nil; 两个说法? 我为什么要分配 再一次? “释放”不够吗? 我应该为我分配/拥有的所有对象都这样做吗?还是仅仅查看对象?

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

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

    5. 在一些教程应用程序中,我观察到这些(用ib构建的): 属性(iboutlet,具有相同的ivar名称): window, someLabel, someTextField, etc etc... 在dealoc方法中,尽管 window 伊瓦尔被释放了,其他人没有。 我的问题是:为什么?我是否也应该发布其他ivar(标签、文本字段)?为什么不呢?

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

    7. 你能给我一些关于核心数据的很好的示例教程吗? (不仅仅是简单的数据获取和存储在具有1/2关系的2/3表上)

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

    4 回复  |  直到 14 年前
        1
  •  5
  •   JeremyP    14 年前

    为什么要在方法内将局部变量声明为“static”?例如:static nsstring*cellIdentifier=@“cell”;这是性能优势吗?(我知道“静态”的作用;在C上下文中)

    在目标C和正常C中,静态是完全相同的。

    这个语法是什么意思?[someobj release],someobj=nil;两个陈述?为什么我要重新分配零?“释放”不够吗?我应该为我分配/拥有的所有对象都这样做吗?还是仅仅查看对象?

    这取决于上下文。它停止了过度释放对象的可能性,因为随后的释放消息将被发送到nil。

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

    不能更改nsstrings,但nsmutableStrings(子类)可以。是的,这是一个防御公约。

    我不应该释放常量nsstring吗?比如:nsstring*cellIdentifier=@“cell”;为什么不呢?编译器是否为我分配/取消分配它?

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

    在一些教程应用程序中,我观察到这些(用ib构建):属性(iboutlet,具有相同的ivar名称):窗口、someLabel、someTextField等。在dealloc方法中,虽然释放了窗口ivar,但其他方法没有。我的问题是:为什么?我是否也应该发布其他ivar(标签、文本字段)?为什么不呢?

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

    我有3个级联下拉列表。我的意思是,根据在第一个列表中选择的内容,填充第二个列表,根据在第二个列表中选择的内容,填充第三个列表。哪些UI组件可以最好地反映这一点?iPhoneUI中的下拉列表是如何显示的?带uipicker的TableView?我应该什么时候更新第二,第三个列表?或者只有三个有触摸事件的标签?

    通过。我不在iPhone上进行用户界面编程。

    你能给我一些关于核心数据的很好的示例教程吗?(不仅仅是简单的数据获取和存储在具有1/2关系的2/3表上)

    作为 Core Data Programming docs 是一个很好的开始的地方。

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

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

        2
  •  1
  •   Manjunath    14 年前

    2。这个语法是什么意思?[someobj release],someobj=nil;两个陈述?为什么我要重新分配零?“释放”不够吗?我应该为我分配/拥有的所有对象都这样做吗?还是仅仅查看对象?

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

    4.我不应该释放常量nsstring吗?比如:nsstring*cellIdentifier=@“cell”;为什么不呢?编译器是否为我分配/取消分配它?

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

    nsstring*cellIdentifier=@“单元格”; 在这里,你根本没有分配它,那你为什么要释放它呢?

    6。我有3个级联下拉列表。我的意思是,根据在第一个列表中选择的内容,填充第二个列表,根据在第二个列表中选择的内容,填充第三个列表。哪些UI组件可以最好地反映这一点?iPhoneUI中的下拉列表是如何显示的?带uipicker的TableView?我应该什么时候更新第二,第三个列表?或者只有三个有触摸事件的标签?

    导航控制器是为满足这种要求而设计的。不是吗?

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

    泄漏

        3
  •  1
  •   Vegar    14 年前

    5。我是否也应该发布其他ivar(标签、文本字段)?

    你能出示完整的申报单吗?你知道,当你声明一个属性时,你指定它应该是一个有保留还是没有保留的赋值(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
    

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

        4
  •  0
  •   Sam    14 年前
    1. 正如汤恩所说,使用C。
    2. 我通常只是 release 我认为设置为零更像是一种风格问题。尤其是如果你在 dealloc ,意外重用的可能性不大。
    3. nsstring可以是nsmutablestring的实例-复制通常更安全。您可以将copy用于其他类,它们在概念上是“值对象”,并实现nscopy。
    4. @"" nsstring文本在您的进程期间都在内存中—您不应该保留或释放它们。
    5. 查看Apple文档 here .
    6. 听起来像多个uitable视图。是否有一个要求让他们同时出现在屏幕上?
    7. 我发现学习核心数据的最佳方法是用它编写应用程序。