0

只需要2个非常基本的说明。

1.

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

@property (nonatomic,retain) NSString* stringInstanceVariable;

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

我应该打电话给:

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

或者

stringInstanceVariable = [NSString stringWithCString:"Hello"];

或者我应该打电话给:

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

2.

使用 interface builder ,例如,当我右键单击文本字段控件时,我会得到一个方法列表。这些到底是什么?我可以注册观察的通知?而且我知道我可以使用 IB 实现并连接它们,我只想知道是否以及如何在没有 IB 的情况下仅使用代码来做到这一点。也许我可以通过使用“addTarget:action:forControlEvent”来做到这一点。

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

4

2 回答 2

0

实际上,它们都没有-stringWithCString被弃用。

您将要使用-stringWithCString:encoding:,提供一个以 null 结尾的字符串和一个NSStringEncoding类型,例如:

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

在此示例中,您输入的任何 C 字符串都必须是 UTF-8。根据您的应用程序,可能还有其他编码。

您想使用self以便访问属性的设置器。

您无需对此进行指定retain,因为该物业会为您处理此问题。

但是,如果您要使用 analloc-init来设置NSString, using -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最终会释放临时变量,但如果你想保持你的内存配置文件紧凑,后一种方法是值得考虑的。

于 2010-07-28T22:25:19.733 回答
0

要回答您的第二个问题,有UITextFieldDelegate protocol一个指定代表同意实施的各种方法的“合同”(除非它们被指定为可选)。

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

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

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

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

于 2010-07-28T22:42:28.397 回答