@implementation中的私有变量

时间:2013-04-16 16:56:14

标签: ios objective-c

在.m中声明一些私有元素,而不是在.h上执行@property是一个好习惯吗?

而且,如果没关系,这些元素是否被视为weak

示例:(在.m的顶部)

   @implementation ParticipantMaterials{
        UIImageView *imgBackground;
        UILabel *lblTitle;
        UITableView *tvTableContent;
        NSMutableDictionary *tblElements;
    }

5 个答案:

答案 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_getInstanceVariableobject_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