Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/118.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 目标C设定者,帮助理解目标C的基础知识_Ios_Objective C - Fatal编程技术网

Ios 目标C设定者,帮助理解目标C的基础知识

Ios 目标C设定者,帮助理解目标C的基础知识,ios,objective-c,Ios,Objective C,我正在看一个演示,我意识到我不了解objective c中编程风格的一些基本内容。演示恰好是斯坦福大学CS193P的第14课。请参阅下面的代码,了解让我困惑的地方。我想这和二传手有关 @synthesize photoDatabase = _photoDatabase; - (void)setPhotoDatabase:(UIManagedDocument *)photoDatabase { if (_photoDatabase != photoDatabase) _p

我正在看一个演示,我意识到我不了解objective c中编程风格的一些基本内容。演示恰好是斯坦福大学CS193P的第14课。请参阅下面的代码,了解让我困惑的地方。我想这和二传手有关

@synthesize photoDatabase = _photoDatabase;

- (void)setPhotoDatabase:(UIManagedDocument *)photoDatabase
{
    if (_photoDatabase != photoDatabase)
        _photoDatabase = photoDatabase;
}
此代码来自youtube视频中的25:00。此处称为photoDatabase的合成属性恰好属于UIManagedDocument类型

我的第一个问题是,为什么要在@synthesis myProperty=\u myProperty中使用下划线。我对此有点困惑,因为我对一般编程都是新手。从XCode 4开始,我们是否在引用此属性时进行了部分合成以消除下划线的需要


我的第二个问题是setPhotoDatabase:方法的用途是什么。我认为讲师正在重写此方法。具体目的是什么?

我来回答你的第一个问题。。。当您使用合成属性时,您只是在为实例变量自动创建setter和getter。假设你有:

@property (nonatomic, strong) NSString *title;
综合:

@synthesize title;
创建以下方法:

- (NSString) title;
- (void) setTitle:(NSString *)value;
现在,在类中,如果要访问title属性,可以使用title或self.title。尽管这两者看起来是同一件事,但事实并非如此。title访问实例变量本身,self.title访问合成方法-NSString title

如果我们有更容易区分两者的方法,事情会变得更简单吗?这就是@synthesis title=\u title;进来。它创建标准setter和getter,但将实例变量设置为_title而不是title


编辑:我相信Xcode 4.3及更高版本会自动为您包含@synthesis=\uu,因此您无需自己执行此操作。

下划线只是将变量标记为实例变量而不是方法变量的一种方式。使用公共成员是一种不好的做法,因此使用setter和getter是正常的@synthesis根据@property关键字后的关键字自动生成getter和setter。它可以在使用arc时生成retainstrong,在使用arc时生成assignweak等setter和getter


此外,您还可以重写这些自动生成的方法中的任何一个,以添加一些逻辑。例如,您可能希望每次更改此值时将消息打印到控制台,或在更改属性后更新视图。

下划线是生成实际ivar的默认方式。 它让你成为某种元。 在类内部,您可以像这样直接引用它们,避免对getter或setter进行不必要的方法调用。 它还保持了作用域的清晰性,并允许您在其他方法声明中使用与属性相同的名称以及参数变量名的getter。这意味着方法的参数将与该属性相关。 下划线可防止局部变量与方法内的ivar冲突

您可以通过手动将ivar名称合成为非常不同的名称,从而有意地对子类创建者模糊ivar名称。 它的用途是保护ivar不受子类创建者的影响,以防您的SPI无法使用它

这样的setter方法的目的是符合惯例和键值编码。其他类使用它来设置ivar

当您需要提供一些超出为您合成的功能时,您可以手动实现自己的setter。
这可能包括数据验证、触发通知或其他事情

嗯,如果你@synthesis属性,你不需要显式地实现它。如果你手动实现,那么你不需要@synthesis.BTW,请不要发布文本截图。注意链接。不要将YouTube链接与所有社交媒体、推荐人和其他参数一起粘贴?V= XXXXXX已经足够了。我自己看了这些视频,他在讲课中确实解释了,相信它可以是2或3的@合成和为什么/何时使用它。@ H2CO3谢谢。我在手上添加代码的时候,你回答。第二个问题,我已经通过了一些Paul Hegarty的教程,他经常覆盖setter和getter来展示如何为学生做这件事,偶尔还会添加更多的功能。。。谢谢