我一直在挣扎的一件事,同时闯入Objective-C编程,就是了解如何操纵属性。我也许使用适当的编码语言而不是脚本语言,我可能会脱离舒适区域,因此在标头文件中声明的内容和实现文件中的内容使我有些困惑。

假设我有一个弦。我希望在该字符串中添加一些文本。我在标题文件中声明什么?在实现文件中我该怎么办才能使其正常工作,@property和@synthesize是什么?

有帮助吗?

解决方案

在Objective-C 2.0之前的不良时代,通常为您的实例变量编写getters and setters

@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的语义的提示。它还允许您@synthesize访问器,因此编译器将自动为其生成代码(您不知道 要 @synthesize,您可以根据需要提供自己的实现)。以上所有内容都可以取代

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

@implementation Foo

// need dealloc to release foo too.

@synthesize foo; 
@end

这节省了很多键入,但您也可以从setfoo的接口中看到:将保留其新值,并且该属性不安全使用(设置 或者 在多线程环境中获得)(没有其他锁定机制)。

其他提示

@property - 声明具有访问和内存修饰符的属性。属性可以阅读或阅读撰写,非原子或原子安全性(线程安全),分配/保留/副本管理。实际上,您可以像我们在老虎时代那样声明简单的Getter和Setter方法,但宣布 @property 将帮助您随时确定该物业的所有方面,而无需检查实施。

@合成 - 如果您需要一个简单的属性,则简化了工作,而Getter和Setter中没有任何复杂的作业。它根据的定义定义了默认实现 @property.

最后,您对字符串的问题。如果您正在寻找简单的东西,则在这里不会有帮助 myObj.string += "abc". 。这不是客观C的样式,无论有无财产,您都会做类似的事情 myObj.string = [[myObj string] stringByAppendingString:@"abc"] 或者 [[myObj string] appendString:@"abc"] 取决于字符串对象的可变/不变性。

作为底线:解释单个帖子中的所有内容是一个很大的话题。我建议您阅读Apple文档,并可能购买有关Objective-C的书。亚伦·希尔加斯(Aaron Hillegass)写了一篇 - 对于任何Objective -C和Mac OS X初学者来说,都是一个很好的开始。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top