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

保留数据成员和通知

  •  0
  • Idan  · 技术社区  · 16 年前

    只需要两个基本的澄清。

    1。

    假设我有一个类A,它有一个成员声明如下:

    @property (nonatomic,retain) NSString* stringInstanceVariable;
    

    在我的一个方法中,我希望将StringInstanceVariable初始化为某个字符串。 我是否需要保留它?

    我应该打电话:

    stringInstanceVariable = [[NSString stringWithCString:"Hello"] retain];
    

    stringInstanceVariable = [NSString stringWithCString:"Hello"];
    

    或者我应该打电话给:

    self.stringInstanceVariable = [NSString stringWithCString:"Hello"];
    

    2。

    使用InterfaceBuilder,当我右键单击一个textfield控件时,我会得到一个方法列表。这些到底是什么?通知我可以注册观察? 我知道我可以使用ib实现并连接它们,我只想知道是否以及如何做到这一点,例如,我可以不使用ib,只使用代码。 也许我可以用“addTarget:Action:ForControlEvent”来完成。

    但如果是这样,那么Cocoa中的事件和通知之间有什么区别呢?或者与委托相比较更合适。

    2 回复  |  直到 9 年前
        1
  •  0
  •   Alex Reynolds    16 年前

    要回答第二个问题,需要 UITextFieldDelegate protocol 它指定了委托同意实现的各种方法的“契约”(除非它们被指定为可选的)。

    在Interface Builder中,将视图控制器连接为文本字段 delegate . 将视图控制器设置为委托意味着您同意在视图控制器中设置非可选方法,这些方法在文本字段中或文本字段中发生事情时被调用。

    例如,学员的 -textFieldDidBeginEditing 当用户开始编辑文本字段中的文本时调用方法。如果代码对您有用的话,您可以在此处放置代码,以跟踪字段的文本内容何时可能更改。您可以(可选)实现其他委托方法。

    委托模式在iOS开发中无处不在。表视图是另一个很好的例子。将控制器类设置为 UITableView 实例。控制器包含几个非可选的委托方法,这些方法指定表视图有多少行和节,以及单元格内容。

    通知与委托不同,因为通常只有一个对象实例被设置为另一个对象的委托。当您希望多个对象能够监听另一个对象中发生的事情时,通知非常有用。通知中心将通知广播到注册的对象以侦听它们。然后,注册对象同意在收到通知时运行方法(“Objective-C语言中的选择器”)。

        2
  •  0
  •   Alex Reynolds    16 年前

    实际上,他们都没有 -stringWithCString 被贬低。

    你会想用的 -stringWithCString:encoding: ,提供以空结尾的字符串和 NSStringEncoding 类型,例如:

    self.stringInstanceVariable = [NSString stringWithCString:"Hello" encoding:NSUTF8Encoding];
    

    在这个例子中,无论您输入的是什么C字符串,都必须是UTF-8。根据您的应用程序,可能还有其他编码。

    你想用 self 以便访问属性的setter。

    您不需要指定 retain 在这个问题上,因为物业会帮你解决这个问题。

    但是,如果您要使用 alloc-init 建立一个 NSString 使用 -initWithCString:encoding ,您需要自动释放它,例如:

    self.stringInstanceVariable = [[[NSString alloc] initWithCString:"Hello" encoding:NSUTF8Encoding] autorelease];
    

    在内存管理方面,这相当于:

    NSString *_tempString = [[NSString alloc] initWithCString:"Hello" encoding:NSUTF8Encoding];
    self.stringInstanceVariable = _tempString;
    [_tempString release];
    

    这有点复杂,但有些人更喜欢后一种方法,尽管它是更多的代码,因为您显式地释放了 _tempString 在它被保留之后 stringInstanceVariable . 在前一种方法中, autorelease 最终会释放临时变量,但是如果您想保持内存配置文件的紧凑性,后面的方法是值得考虑的。