gpt4 book ai didi

objective-c - 自动合成属性 'delegate' 将使用合成实例变量 '_delegate' ,而不是现有实例变量 'delegate'

转载 作者:太空狗 更新时间:2023-10-30 03:15:25 28 4
gpt4 key购买 nike

我正在按照指南 here创建自定义委托(delegate)。它运行良好,但我在 xcode 中收到以下警告

DetailViewController.m:23:1: Autosynthesized property 'delegate' will use synthesized instance variable '_delegate', not existing instance variable 'delegate'

任何人都可以建议如何摆脱警告

最佳答案

处理这种情况最惯用的方法就是删除你的 delegate伊娃声明。如果您使用的是 delegate ivar,你应该使用隐式 ivar _delegate相反。

为什么会这样?

截至Xcode 4.4 (LLVM Compiler 4.0) ,如果 @synthesize 为属性 自动合成实例变量和访问器方法。指令未明确用于该属性。作为Apple's documentation on encapsulation

By default, [...] accessor methods are synthesized automatically for you by the compiler, so you don’t need to do anything other than declare the property using @property in the class interface.

用于属性(由自动合成的属性访问器方法获取和设置)的 ivar 名为 _<propertyName> (即 ivar 的名称是带有下划线前缀的属性名称)。

在这种情况下,属性名称是 delegate ,因此使用的 ivar 是 _delegate .这已经在您的代码中发生了。当您调用 -delegate-setDelegate: , 这个伊娃 _delegate将被获取和设置。

但是,您还声明了自己的 ivar delegate .当然,您显式声明的ivar ( delegate ) 不会被实例方法-delegate 获取和设置。和 -setDelegate:因为正在获取和设置自动合成的 ivar ( _delegate )。但是,(几乎总是——如果不是,你的代码是模棱两可的)你的意图是为了你的 ivar delegate成为您的属性(property)的访问者将获得和设置的东西。幸运的是,编译器足够聪明,可以注意到您所做的事情,这就是它发出此警告的原因:

warning: autosynthesized property 'delegate' will use synthesized instance variable '_delegate', not existing instance variable 'delegate' [-Wobjc-autosynthesis-property-ivar-name-match]

它告诉你,你的属性(property)delegate将使用自动合成的ivar _delegate而不是您明确声明的伊娃,delegate .

因此,如果您只是删除 delegate ivar,编译器将停止发出此警告。如果您使用的是 delegate直接ivar(不通过属性),开始使用_delegate相反。


此选项的一个小变化是显式声明与 _delegate 的自动合成相同的 ivar ( delegate )属性(property)正在创造。您可以通过替换

@interface TheClass : TheSuperclass
{
//...
id<TheDelegateProtocol> delegate
//...
}
@end

@interface TheClass : TheSuperclass
{
//...
id<TheDelegateProtocol> _delegate
//...
}
@end

这是有效的,因为属性的自动合成将始终使用一个 ivar,其名称是属性名称加上下划线前缀。如果不存在这样的ivar,则将生成ivar。如果它确实存在,它将被使用。


相反,如果您希望您的属性的访问器设置并获取您的 ivar delegate你可以添加一个@synthesize给你类(class)的指令'@implementation告诉编译器这样做:

@implementation TheClass
//...
@synthesize delegate = delegate;
//...
@end

@synthesize delegate = delegate;告诉编译器使用 ivar delegate (赋值的右侧)在属性的访问器中 delegate (作业的左侧)。

您也可以省略 @synthesize 的右侧分配并写

@implementation TheClass
//...
@synthesize delegate;
//...
@end

这是有效的,因为一个带有手册的属性 @synthesize它没有明确指定要由其访问器获取和设置的 ivar(例如 @synthesize delegate; )将使用与属性同名的 ivar,不使用下划线作为前缀。这与向后兼容性有关。

关于objective-c - 自动合成属性 'delegate' 将使用合成实例变量 '_delegate' ,而不是现有实例变量 'delegate',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14184691/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com