Objective c 目的c差异

Objective c 目的c差异,objective-c,ios,syntax,Objective C,Ios,Syntax,在.h或.m文件中声明@property有什么区别 @property (nonatomic, readwrite, assign) BOOL notificationDidLaunch; 这与变量的范围有关吗 同样在.h文件中,用这样的brakets声明字符串有什么区别 @interface AppDelegate : NSObject < UIApplicationDelegate > { NSString *hat; } 总结性解释 .m中的@属性是类的私有属性,而

在.h或.m文件中声明@property有什么区别

@property (nonatomic, readwrite, assign) BOOL notificationDidLaunch;
这与变量的范围有关吗

同样在.h文件中,用这样的brakets声明字符串有什么区别

@interface AppDelegate : NSObject < UIApplicationDelegate > {
    NSString *hat;
}

总结性解释

.m中的
@属性
是类的私有属性,而.h中的属性是公共属性

在括号内声明与不在括号内声明的区别在于变量的含义

在括号内声明一个实例变量(或ivar),该变量意味着只能由类的实例访问。属性(在.h中声明)意味着任何类都可以访问

属性

@属性本质上定义了一个可以覆盖的集合和get。当您这样做时:

AppDelegate myAppDelegate;
myAppDelegate.hat = @"A hat": 
你基本上在做:

[myAppDelegate setHat:@"A hat"]
当你这么做的时候

myAppDelegate.hat //so you can get the property's value
你实际上是在做什么

[myAppDelegate hat]
覆盖集合和获取

当您执行
@synthesis hat=\u hat
时,您实际上是在创建一个get和一个集合,其中包含一个关联的实例变量
\u hat
。此实例变量只能在gets/Set中访问,甚至在类中也应该使用Set/gets(使用
self.property

您可以覆盖集合并通过覆盖以下方法的
@synthesis
来创建:

- (void) setHat:(NSString*) aHat
- (NSString *) hat

总结性解释

.m中的
@属性
是类的私有属性,而.h中的属性是公共属性

在括号内声明与不在括号内声明的区别在于变量的含义

在括号内声明一个实例变量(或ivar),该变量意味着只能由类的实例访问。属性(在.h中声明)意味着任何类都可以访问

属性

@属性本质上定义了一个可以覆盖的集合和get。当您这样做时:

AppDelegate myAppDelegate;
myAppDelegate.hat = @"A hat": 
你基本上在做:

[myAppDelegate setHat:@"A hat"]
当你这么做的时候

myAppDelegate.hat //so you can get the property's value
你实际上是在做什么

[myAppDelegate hat]
覆盖集合和获取

当您执行
@synthesis hat=\u hat
时,您实际上是在创建一个get和一个集合,其中包含一个关联的实例变量
\u hat
。此实例变量只能在gets/Set中访问,甚至在类中也应该使用Set/gets(使用
self.property

您可以覆盖集合并通过覆盖以下方法的
@synthesis
来创建:

- (void) setHat:(NSString*) aHat
- (NSString *) hat

正如Tiago所说,在.m(实现)文件的类扩展名中放置@property声明是一种使属性私有的方法,因此只有类本身可以访问它。当在.h(公共接口文件)中声明时,它对导入该.h文件的所有代码都可见。请记住,@properties实际上只是声明和合成访问器方法的一种方便,与Objective-C中的所有方法一样,它们从来都不是真正私有的。最好的结果是编译器警告,如果您试图在另一个类中使用非公共方法,则没有公共接口声明有问题的方法

对于问题的第二部分,这声明了一个名为myString的实例变量(“ivar”):

@interface MyClass : NSObject
{
    NSString *myString;
}
@property NSString *myString;
虽然这声明了一个名为myString的属性:

@interface MyClass : NSObject
{
    NSString *myString;
}
@property NSString *myString;

实例变量和@property之间的区别比仅仅说ivar只能由类的实例访问更重要。声明ivar会将变量添加到内存中的类结构中。相反,@properties在类上声明/定义方法。默认情况下,这些方法设置/获取关联的、名称类似的ivar的值,但这不是一个要求,并且完全可以接受并且非常常见的是,对于@property,有不直接访问ivar的方法。例如,假设一个类具有由
\u firstName
\u lastName
ivars支持的firstName和lastName属性,以及第三个全名属性,该属性仅将firstName和lastName getter方法返回的值连接在一起(和/或在其set方法中拆分两部分名称)。

正如Tiago所说,将@property声明放在.m(实现)文件的类扩展名中,是一种使属性私有的方法,这样只有类本身才能访问它。当在.h(公共接口文件)中声明时,它对导入该.h文件的所有代码都可见。请记住,@properties实际上只是声明和合成访问器方法的一种方便,与Objective-C中的所有方法一样,它们从来都不是真正私有的。最好的结果是编译器警告,如果您试图在另一个类中使用非公共方法,则没有公共接口声明有问题的方法

对于问题的第二部分,这声明了一个名为myString的实例变量(“ivar”):

@interface MyClass : NSObject
{
    NSString *myString;
}
@property NSString *myString;
虽然这声明了一个名为myString的属性:

@interface MyClass : NSObject
{
    NSString *myString;
}
@property NSString *myString;

实例变量和@property之间的区别比仅仅说ivar只能由类的实例访问更重要。声明ivar会将变量添加到内存中的类结构中。相反,@properties在类上声明/定义方法。默认情况下,这些方法设置/获取关联的、名称类似的ivar的值,但这不是一个要求,并且完全可以接受并且非常常见的是,对于@property,有不直接访问ivar的方法。例如,假设一个类具有由
\u firstName
\u lastName
ivars支持的firstName和lastName属性,以及第三个全名属性,该属性将firstName和lastName getter方法返回的值连接在一起(和/或在其set方法中拆分两部分名称).

如此不公平的解释:p。我希望我们能去默格