在.m中声明一些私有元素,而不是在.h上执行@property是一个好习惯吗?
而且,如果没关系,这些元素是否被视为weak
?
示例:(在.m的顶部)
@implementation ParticipantMaterials{
UIImageView *imgBackground;
UILabel *lblTitle;
UITableView *tvTableContent;
NSMutableDictionary *tblElements;
}
答案 0 :(得分:14)
在@implementation
区域中声明变量时,您声明的是实例变量,而不是属性。你没有@synthesize
ivars。如果要声明隐藏在公共.h文件中的私有属性,可以像这样创建它们:
@interface ParticipantMaterials ()
@property (nonatomic) NSUInteger uintProp;
@property (nonatomic, copy) NSString* strProp;
@end
这称为类扩展。
默认情况下,实例变量被视为strong
,除非您指定__weak
类型修饰符。
答案 1 :(得分:6)
如果要声明私有变量,则任何这些声明都将执行:
@interface Animal : NSObject {
@private
NSObject *iPrivate;
}
@end
@interface Animal(){
@public
NSString *iPrivate2;
}
@property (nonatomic,strong) NSObject *iPrivate3;
@end
@implementation Animal {
@public
NSString *iPrivate4;
}
@end
我添加@public指出它没有任何区别。所有这些变量都是私有的,如果你试图从子类或不同的类中设置它们,它将产生compiler error: undeclared identifier
或者在第一种情况下compiler error: variable is private
。
默认情况下,ARC下的所有对象变量都很强大,因此如果您愿意,可以从@property中省略strong
。
Objective-C中的变量不是100%私有的。您可以使用运行时函数class_getInstanceVariable
和object_getIvar
从任何地方获取/设置它们。
答案 2 :(得分:1)
优良作法是尽可能少地使用.h文件。所以,是的,在.m文件中声明私有ivars和私有属性是一种好习惯。
.h文件应该只有真正的公开声明。
示例:
SomeClass.h:
@interface SomeClass : NSObject <NSCoding> // publicly state conformance to NSCoding
@property (nonatomic, copy) NSString *publicProperty;
- (void)somePublicMethod;
@end
SomeClass.m
@interface SomeClass () <UIAlertViewDelegate> // implementation detail
@property (nonatomic, assign) BOOL privateProperty;
@end
@implementation SomeClass {
UIAlertView *_privateAlert; // private ivar
}
// all the methods
@end
所有这些都利用了现代的Objective-C编译器。不需要明确的@synthesize
行(尽管如果合适,仍然可以使用它们)。无需为每个属性声明ivars(尽管它们可以适用)。
请注意,在ARC下,ivars和局部变量为strong
,而不是weak
。
答案 3 :(得分:0)
你还必须注意到在64位架构上,llvm编译器为@property中声明的iVar保留内存,因为Obj-C 2.0和intel 64bit CPU,我不再指定我的iVars了。
OOP范例指定默认情况下,所有已实施的iVar都是私有
答案 4 :(得分:0)
@interface PassedAndCorrectTableVC ()
{
NSMutableArray *arrPassesdListName;
NSMutableArray *arrCorrectListNmae;
NSMutableArray *arrTotalName;
}
@end