您可能想要的(除非您使用的是非常旧的操作系统和编译器)只是使用属性语法。IE:
@interface MyClass : NSObject
// method declarations here ...
@property (copy) NSString* myVar;
// ... or here.
@end
这将做你打算做的事情。这将隐式合成一个实例变量和该变量的 getter/setter 对。如果您想要手动创建实例变量(通常不需要,除非您需要您的代码在非常旧的 MacOS 版本上工作),这就是上面的代码在后台创建 ivar 的作用:
@interface MyClass : NSObject
{
NSString* _myVar;
}
// method declarations here.
@end
请注意花括号,它告诉编译器这不仅仅是方法之间的全局变量,实际上是属于该对象的实例变量。
如果您创建该属性仅用于内部使用并且不希望您的类的客户端弄乱它,您可以通过使用“继续”类的类扩展将它隐藏在最古老的 ObjC 编译器之外的所有东西中来自标头的声明,但可以与它分开放置(通常在您的实现文件中)。类扩展看起来像一个没有名称的类别:
@interface MyClass ()
@property (copy) NSString* myVar;
@end
你可以把你的属性声明放在那里,或者甚至是 ivar 声明(同样用大括号括起来)。您甚至可以声明与类接口中相同的属性readonly
,然后重新声明它相同,但readwrite
与扩展中的一样,这样客户端只能读取它,但您的代码可以更改它。
Note that, if you didn't use ARC (that is, you've switched off the default of Automatic Reference Counting), you would have to set all your properties to nil
in your dealloc
method (unless they're set to weak
or assign
of course).
NB - All the above are @interface
sections. Your actual code will go in separate @implementation
sections. This is so you can have header files (.h
) you can hand off to your class's clients that just contain the portions you intend them to use, and hide away implementation details in the implementation file (.m
) where you can change them without having to worry someone might have accidentally used them and you'll break other code.
PS - 请注意,NSStrings
您想要不可变风格但也存在于可变风格(即NSMutableString
)中的其他对象应该始终是copy
属性,因为这会将 NSMutableString 转换为 NSString ,这样外部的任何人都无法更改可变的你身下的绳子。对于所有其他对象类型,您通常使用strong
(或者retain
如果不是 ARC)。对于您的班级所有者(例如其代表),您通常使用weak
(或者assign
如果不是 ARC)。