4

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

而且,如果可以,这些元素是否被视为weak

示例:(在 .m 的顶部)

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

5 回答 5

15

@implementation区域中声明变量时,您声明的是实例变量,而不是属性。你没有@synthesizeivars。如果要声明对公共 .h 文件隐藏的私有属性,可以像这样创建它们:

@interface ParticipantMaterials ()

@property (nonatomic) NSUInteger uintProp;
@property (nonatomic, copy) NSString* strProp;

@end

这称为类扩展。

默认情况下会考虑实例变量strong,除非您指定__weak类型修饰符。

于 2013-04-16T17:00:25.043 回答
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 identifieror,在第一种情况下compiler error: variable is private

默认情况下,ARC 下的所有对象变量都是强变量,因此您可以根据需要strong从 @property 中省略。

Objective-C 中的变量不是 100% 私有的。您可以使用运行时函数class_getInstanceVariableobject_getIvar.

于 2013-04-16T17:11:26.930 回答
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

于 2013-04-16T17:11:19.053 回答
0

您还必须注意,在 64 位架构上,llvm 编译器为 @property 中声明的 iVar 保留内存,因为 Obj-C 2.0 和英特尔 64 位 CPU,我不再指定我的 iVar。

OOP 范式指定默认情况下,所有实现的 iVar 都是私有的

于 2013-04-16T18:46:43.837 回答
0
@interface PassedAndCorrectTableVC ()
{
NSMutableArray *arrPassesdListName;

NSMutableArray *arrCorrectListNmae;

NSMutableArray *arrTotalName;
}
@end
于 2015-12-08T09:44:53.923 回答