在Objective-C中设置属性详细信息

在Objective-C中设置属性详细信息,objective-c,properties,implementation,synthesizer,Objective C,Properties,Implementation,Synthesizer,在攻入Objective-C编程时,我一直在努力解决的一件事就是理解如何操作属性。我可能不习惯使用合适的编码语言,而不是我习惯的脚本语言,因此在头文件和实现文件中声明内容让我有些困惑 假设我有一根绳子。我想在字符串中添加一些文本。我在头文件中声明了什么,在实现文件中声明了什么才能使其正常工作,@property和@synthesis是什么?

在攻入Objective-C编程时,我一直在努力解决的一件事就是理解如何操作属性。我可能不习惯使用合适的编码语言,而不是我习惯的脚本语言,因此在头文件和实现文件中声明内容让我有些困惑


假设我有一根绳子。我想在字符串中添加一些文本。我在头文件中声明了什么,在实现文件中声明了什么才能使其正常工作,@property和@synthesis是什么?

-声明了带有访问和内存修饰符的属性。属性可以是只读或读写、非原子或原子(线程安全)、分配/保留/复制管理。实际上,您可以像在Tiger时代那样声明简单的getter和setter方法,但是声明
@property
将帮助您在任何时候识别属性的所有方面,而无需检查实现

@synthesis-如果您需要一个简单的属性,而不需要在getter和setter中执行任何复杂的作业,则可以简化作业。它根据
@property
的定义定义默认实现

最后,请回答关于字符串的问题。如果您正在寻找一些简单的东西,那么属性在这里没有帮助,比如说
myObj.string+=“abc”
。它不是Objective-C样式,无论是否使用属性,您都可以根据字符串对象的可变/不可变性质执行类似于
myObj.string=[[myObj string]stringByAppendingString:@“abc”]
[[myObj string]appendString:@“abc”]
的操作


作为一条底线:在一篇文章中解释所有内容是一个相当大的话题。我建议您阅读苹果公司的文档,或许可以购买一本关于Objective-C的书。Aaron Hillegass写了一本——这对任何Objective-C和MacOSX初学者来说都是一个好的开始。

在Objective-C 2.0之前的糟糕日子里,为您的实例变量编写getter和setter是很常见的

@interface Foo : NSObject
{
@private 
    id foo;
}
-(void) setFoo: (id) newFoo;
-(id) foo;
@end

@implementation Foo

// need dealloc to release foo too.

-(void) setFoo: (id) newFoo
{
    [newFoo retain];
    [foo release];
    foo = newFoo;
}

-(id) foo
{
   return foo;
}
@end
这只是在单线程环境中。多线程应用程序甚至需要更多的东西

属性为上述内容提供了简洁的简写。@property替换接口中的两个声明,并为调用方提供关于getter和setter语义的更好提示。它还允许您@synthesis访问器,这样编译器将自动为它们生成代码(您不必@synthesis访问器,如果需要,您可以提供自己的实现)。以上所有内容都可以用

 @interface Foo : NSObject
{
@private 
    id foo;
}
@property (nonatomic, retain) id foo;
@end

@implementation Foo

// need dealloc to release foo too.

@synthesize foo; 
@end
这节省了大量的输入,但您也可以从接口中看到setFoo:将保留其新值,并且在多线程环境中(没有其他锁定机制)使用(设置或获取)该属性是不安全的