小编典典

语义问题:属性的合成 getter 遵循 Cocoa 命名约定以返回“拥有”对象

all

我目前正在使用 iOS 5 SDK 尝试开发我的应用程序。我正在尝试使 NSString 成为属性,然后在 .m
文件中合成它(我之前已经这样做了,没有任何问题)。现在,我遇到了这个问题:“语义问题:属性的合成 getter 遵循 Cocoa
命名约定以返回‘拥有’对象。”

这是我的代码:.h

@interface ViewController : UIViewController {
     NSString *newTitle;
}
@property (strong, nonatomic) NSString *newTitle;

.m

@synthesize newTitle;

有谁知道我该如何解决这个问题?谢谢!!


阅读 91

收藏
2022-04-26

共1个答案

小编典典

我的猜测是,您使用的编译器版本遵循声明属性的内存管理规则,更具体地说,对于声明的属性访问器:

如果您使用名称以“渥lloc”、“渘ew”、“opy”或“utableCopy”开头的方法创建对象,则您拥有该对象的所有权。

一个名为 的属性newTitle在合成时会产生一个名为
的方法-newTitle,因此会产生警告/错误。-newTitle应该是该newTitle属性的 getter
方法,但是命名约定规定名称以开头的方法new返回一个对象,该对象由调用者拥有,而 getter 方法不是这种情况。

您可以通过以下方式解决此问题:

  1. 重命名该属性:

    @property (strong, nonatomic) NSString *theNewTitle;
    
  2. 保留属性名称并指定不以特殊方法名称前缀之一开头的 getter 名称:

    @property (strong, nonatomic, getter=theNewTitle) NSString *newTitle;
    
  3. 保留属性名称和 getter 名称,并告诉编译器,即使 getter 名称以 开头new,它也属于none方法族而不是new方法族:

    #ifndef __has_attribute
    

    define __has_attribute(x) 0 // Compatibility with non-clang compilers

    endif

    if __has_attribute(objc_method_family)

    define BV_OBJC_METHOD_FAMILY_NONE attribute((objc_method_family(none)))

    else

    define BV_OBJC_METHOD_FAMILY_NONE

    endif

    @interface ViewController : UIViewController
    @property (strong, nonatomic) NSString newTitle;
    - (NSString
    )newTitle BV_OBJC_METHOD_FAMILY_NONE;
    @end

请注意,即使此解决方案允许您同时保留newTitle属性名称和 getter
名称,但调用的方法-newTitle不会返回调用者拥有的对象,这可能会让其他阅读您的代码的人感到困惑。


作为记录,Apple 发布了Transitioning to ARC Release
Notes
,其中声明:

您不能为属性指定以newor开头的名称copy

他们已经被告知他们的陈述不太准确:罪魁祸首是 getter 方法名称,而不是属性名称。


编辑 2015 年 1 月 17 日: 我刚刚注意到最近对 Clang 的提交建议上面的选项
3(使用objc_method_family(none)),包括修复它,用于属性名称与特殊方法系列前缀之一匹配的一般情况。Xcode
很可能最终会合并此更改。

2022-04-26