草庐IT

iphone - Objective C ivars 或 @property

coder 2023-09-22 原文

在 iPhone 上工作,在经历了很多头痛和内存问题之后,我刚刚从其他示例中意识到我们不需要为我们在头文件中定义的每个实例变量创建@properties。实际上,我发现在类里面的任何地方使用后,ivars 很容易分配和释放它,对于@properties,我必须使用 autorealese,否则我会遇到严重的问题并注意我的分配方式..

例如,对于下面的对象,@properties(retain/copy..) 在许多示例中都没有在 header 中使用;

{
NSURLConnection *connection;
NSMutableData *xmlData;
NsMutableString *string
} 

但对于某些字符串或对象类型,使用了@properties,我知道当我们设置@property 时,cocoa 会创建一些 setter getter,它们正在处理对象的释放和保留。但是对于 xmlData 或连接实例变量,我们似乎不需要它,它们就是这样工作的。

在决定是创建@property 还是只使用简单的ivar 时,是否有一些引用指南可供我牢记?

我在使用属性时唯一的问题不是因为我懒得定义它,而是当我在代码中仔分割配和初始化它们时,我必须使用自动释放并且感觉我无法控制何时释放重置和分配它再次,它让我又担心一件事,我应该何时何地以及如何释放,重置它。我发现我可以随时随地轻松地分配和释放 ivars 而无需担心任何事情..或者我在这里遗漏了其他东西。

谢谢

最佳答案

关于属性似乎仍然存在一些误解。

that we do not need to necessarly create @properties for each instance variable we define in header file

正确。您可以直接在您的实现文件中使用私有(private)实例变量。但是,由于综合 属性带有免费的内存管理,您不妨利用一下。我的经验法则是直接使用 ivar,直到我第一次发现自己在写:

[ivar release];
ivar = [newIvar retain];

正如 Sam 所说,如果 iVar == newIVar 就已经存在潜在的错误。这是我从直接使用 ivars 切换到创建属性的时候。但是,我将新属性的声明放在 class extension 中。在实现文件中。这意味着该属性正式不是公共(public)接口(interface)的一部分(如果不小心使用会导致编译器警告)。

when we set @property cocoa creates some setters getters which are handling the relasing and retaining of the objects.

实际上,没有。 @property 只是声明一个属性。为了自动生成getter和setter,你需要@synthesize它。或者,您可以编写自己的 getter 和 setter,它们甚至不必引用真正的 ivar。

从技术上讲,您不应在 init 或 dealloc 方法中使用该属性,因为子类可能已覆盖它们,或者(在 dealloc 中)您可能会触发 KVO 通知。


来自山姆的回答和评论

If you want a property regardless, you could use a private interface at the top of the implementation file

正如我上面所说,私有(private)类别已经被类扩展所淘汰(这几乎是同一件事,但允许您将方法的实现放在主类实现中)。

If you want the benefits of using dot notation shorthand

我们中的一些人会争辩说点符号没有任何好处。这是对结构成员语法的无端和不必要的污染。但是,点符号与 @property 声明无关。您可以对任何访问器使用点表示法,无论它们是如何声明的,只要它们遵守模式 -foo-setFoo:

关于iphone - Objective C ivars 或 @property,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6942439/

有关iphone - Objective C ivars 或 @property的更多相关文章

  1. ruby - @property 或 self.property 使用访问器设置属性? - 2

    哪个是更好的做法;通过@property或self.property使用访问器操作属性? 最佳答案 如果您只是使用直接访问器,那么请坚持使用@property(除非您来自Python并且被@sigilhehe关闭)否则:这完全取决于您。但是self.property在某些需要确保属性已初始设置的情况下很有用:defproperty@property||=[]end#don'tneedtocheckif@propertyis`nil`firstself.property另请注意,在@property上使用self.property会产

  2. ruby-on-rails - Rails 查询 : Filter by properties in another table - 2

    我正在寻找一个清晰的Rails4示例,说明如何根据通过另一个表关联的数据过滤记录。假设我有一个用户模型和一个评论模型。一个用户has_many评论,一个Commentbelongs_to一个用户。评论在其表中也有一个score列。classUserUsers|id|name|email||-----|---------|---------------------||1|"Alice"|"alice@example.com"||2|"Bob"|"bob@example.com"||...|classComment我如何获得所有对内容“k”发表评论且分数>0的用户?请注意,我要返回的是用户

  3. ruby-on-rails - :autosave property of has_many associations broken in Rails 2. 3.4? - 2

    在我将此作为错误发布给Rails团队之前,我想看看我是否做错了可能导致此行为的事情。具体来说,has_many关联的:autosave属性似乎没有按照文档工作。作为引用,这里是最新的API文档:http://api.rubyonrails.org/classes/Acti...ation.html查看“一对多示例”部分。我已经在测试应用程序中完全复制了代码,但它对我不起作用。具体来说,更新父对象,但不更新子对象。我的架构如下:create_table:postsdo|t|t.string:titlet.timestampsendcreate_table:commentsdo|t|t.t

  4. iphone - 扩展 restful_authentication/AuthLogic 以支持匿名 iPhone 的延迟登录的最佳方法是什么? - 2

    我正在构建一个与RubyonRails后端对话的iPhone应用程序。RubyonRails应用程序还将为Web用户提供服务。restful_authentication插件是提供快速和可定制的用户身份验证的绝佳方式。但是,我希望iPhone应用程序的用户在新列中存储一个由手机的唯一标识符([[UIDevicedevice]uniqueIdentifier])自动创建的帐户。稍后,当用户准备好创建用户名/密码时,帐户将更新为包含用户名和密码,iPhone唯一标识符保持不变。用户在设置用户名/密码之前不能访问该网站。然而,他们可以使用iPhone应用程序,因为该应用程序可以使用它的标识符

  5. iphone - 设计和 Rails 3 中的 http 身份验证 - 2

    我有一个使用deviseonrails3的应用程序。我想启用http身份验证,以便我可以从iPhone应用程序向我的网络应用程序进行身份验证。如何从我的iPhone应用程序进行身份验证以进行设计?这安全吗?还是我应该进行不同的身份验证? 最佳答案 从设计的角度来看,您有3个选择:1)使用基本的http身份验证:您的iPhone应用程序有一个secretkey-这是在您的iPhone应用程序代码中烘焙的-用于对网络应用程序的每个请求进行身份验证。Google搜索:“设计基本的http身份验证”2)您可以通过在您的iPhone应用程序中

  6. ruby - 是否可以让 class.property = x 返回 x 以外的东西? - 2

    假设我有一个Ruby类:classMyClassdefself.propertyreturn"someVal"enddefself.property=(newVal)#dosomethingtoset"property"success=truereturnsuccess#successisabooleanendend如果我尝试执行MyClass.property=x,整个语句的返回值始终是x。许多基于C/受启发的语言都习惯于返回bool“成功”值-是否可以使用Ruby中的“等于语法”为setter执行此操作?此外-如果这不可能,为什么不呢?允许“equalssetter”操作返回一个值

  7. iphone - 在没有 Mac 的情况下开发 iPhone 应用程序? - 2

    这个问题在这里已经有了答案:关闭13年前。PossibleDuplicates:HowcanIdevelopforiPhoneusingaWindowsdevelopmentmachine?我想为我妻子的手机构建一个iPhone应用程序,但我对购买Mac作为一次性工作的开发平台不感兴趣。应用程序:应该在iPhone上独立运行(即没有网络连接)完全可以接受使用iPhoneJavascript库之一创建的GUI会做一些数据库IO来读取和更新数据没有商业值(value),永远不会被任何人使用这是我的想法:越狱iPhone在iPhone上安装Ruby+Sinatra使用Sinatra编写应用程

  8. iphone - iPhone 原生应用的测试驱动设计 - 2

    我正在试验iPhoneSDK并在Nic博士的rbiPhoneTest项目中做一些TDD。我想知道有多少人(如果有的话)成功地使用了这个或任何其他iPhone/Cocoa测试框架?更重要的是,我想知道如何最好地断言专有的二进制请求/响应协议(protocol)。这个想法是通过网络发送二进制请求并接收二进制响应。请求和响应是使用byteand'ing和or'ing创建的。我正在使用黄金副本模式来测试我的请求。这是我到目前为止所拥有的。不要笑,因为我是ObjectiveC和Ruby的新手:requireFile.dirname(__FILE__)+'/test_helper'require'

  9. iphone - 如何从视频中提取方向信息? - 2

    在网络上浏览了大量文档后,iPhone似乎总是以480x360的纵横比拍摄视频,并在视频rails上应用变换矩阵。(480x360可能会改变,但对于给定设备而言始终相同)这是一种在iOS项目中修改ffmpeg源代码并访问矩阵http://www.seqoy.com/correct-orientation-for-iphone-recorded-movies-with-ffmpeg/的方法这是在iOS-4中查找转换矩阵的更清晰的方法Howtodetect(iPhoneSDK)ifavideofilewasrecordedinportraitorientation,orlandscape.

  10. ruby - Java .properties 文件等效于 Ruby? - 2

    我需要将一些简单的属性存储在文件中并通过Ruby访问它们。我非常喜欢.properties文件格式,它是Java中此类事物的标准(使用java.util.Properties类)...它简单、易于使用且易于阅读。那么,是否有某个地方的Ruby类可以让我从这样的文件中加载一些键值对而不需要很多努力?我不想使用XML,所以请不要建议REXML(我的目的不保证“尖括号税”)。我考虑过推出我自己的解决方案...它可能最多只有5-10行代码,但我仍然宁愿使用现有的库(如果它本质上是从文件构建的哈希)...因为这会将它减少到1行....更新:它实际上是一个直接的Ruby应用程序,而不是Rails,

随机推荐