Spr*_*ing 6 iphone objective-c ios
在iPhone上工作之后,经过很多头痛和内存问题后我才从其他示例中了解到,我们不需要为头文件中定义的每个实例变量创建@properties.实际上我发现ivars很容易在我在课堂上的任何地方使用后分配和释放它,对于@properties我必须使用autorealese或者我有严重的问题并且因为我如何分配..
例如,对于下面的对象,许多示例中的标题中未使用@properties(retain/copy ..);
{
NSURLConnection *connection;
NSMutableData *xmlData;
NsMutableString *string
}
Run Code Online (Sandbox Code Playgroud)
但是对于某些字符串或对象类型使用@properties,我知道当我们设置@property时,cocoa会创建一些setter getter来处理对象的重新发送和保留.但似乎对于xmlData或连接实例变量我们不需要它,他们就像这样做.
在决定是否创建@ property或仅使用简单的ivars时,是否有一些参考指南?
我在使用属性时唯一的问题是因为我懒得定义它,但是当我在代码中仔细分配并初始化它们时,我必须使用autorelase并且不觉得我有控件何时释放重置并再次分配它,并且它让我有一件事需要担心,我何时以及何时应该释放,重置它.我发现ivars我可以随时轻松地分配和释放一次而不用担心任何事情......或者我在这里错过了其他的东西.
TNX
关于房产似乎仍然存在一些误解.
我们不需要为头文件中定义的每个实例变量创建@properties
正确.您可以直接在实现文件中使用私有实例变量.但是,由于合成属性带有可用内存管理,因此您也可以利用它.我的经验法则是直接使用ivar直到我第一次发现自己写作:
[ivar release];
ivar = [newIvar retain];
Run Code Online (Sandbox Code Playgroud)
正如萨姆所说,如果存在潜在的错误iVar == newIVar
.这是我从使用ivars直接切换到创建属性的关键点.但是,我将新属性的声明放在实现文件的类扩展中.这意味着该属性正式不属于公共接口(如果意外使用,将导致编译器警告).
当我们设置@property时,cocoa会创建一些setter getter来处理对象的重新发送和保留.
实际上,没有.@property只声明了一个属性.为了自动生成getter和setter,你需要@synthesize它.你也可以编写自己的getter和setter,甚至不需要引用真正的ivar.
从技术上讲,您不应该在init或dealloc方法中使用该属性,因为子类可能已覆盖它们,或者(在dealloc中)您可能会设置KVO通知.
来自Sam的回答和评论
如果您想要一个属性,可以在实现文件的顶部使用私有接口
正如我上面所说的那样,私有类别已经被类扩展所废弃(这与类似的东西差不多,但允许您将方法的实现放在主类实现中).
如果你想要使用点符号简写的好处
我们中的一些人会争辩说点符号没有任何好处.这是结构成员语法的无偿和不必要的污染.但是,点符号与@property
声明无关.您可以对任何访问器使用点表示法,无论它们如何声明,只要它们符合模式-foo
和-setFoo:
归档时间: |
|
查看次数: |
2469 次 |
最近记录: |