标签: ivars

Xcode 4.5中@property和ivar的区别

以前我一直看到使用属性和iVars这样的例子......

在SomeClass.h里面

@interface SomeClass : NSObject {
    NSString *_someString;
}

@property NSString *someString;

@end
Run Code Online (Sandbox Code Playgroud)

然后在SomeClass.m中

#import "SomeClass.h"

@implementation SomeClass

@synthesize someString = _someString;

@end
Run Code Online (Sandbox Code Playgroud)

最近(在WWDC 2012视频中)我听说我们不再需要@synthesize它,建议只使用@property没有它的相关iVar.

所以上面会变成......

SomeClass.h

@interface SomeClass : NSObject

@property NSString *someString;

@end
Run Code Online (Sandbox Code Playgroud)

SomeClass.m

#import "SomeClass.h"

@implementation SomeClass

@end
Run Code Online (Sandbox Code Playgroud)

这只是使用@property和没有ivar.这是有道理的,我一直在使用它.

但是,我也看过......的例子

SomeClass.h

@interface SomeClass : NSObject

@end
Run Code Online (Sandbox Code Playgroud)

SomeClass.m

#import "SomeClass.h"

@interface SomeClass () {
    NSString *someString;
}

@end

@implementation SomeClass

@end
Run Code Online (Sandbox Code Playgroud)

在这个他们只有一个私人iVar和没有@property.

那有什么区别?我知道它也@property提供了访问器方法,但您不必重写访问器方法.您可以使用默认访问者.

所以你什么时候才能使用@property而不是ivar @property …

iphone properties ios ivars

12
推荐指数
1
解决办法
5490
查看次数

Objective-c:为什么在使用KVC时私人ivars不会被外部访问隐藏

在尝试使用KVC访问ivars之后,我注意到私人和受保护的ivars没有保护.我把它放在ivar(私人或受保护的关键字)前面并不重要 - 当使用KVC方法"setValue"时,ivar总是公共的ivar.这是我的代码,其中所有七个ivars和属性都可以在类实例之外更改:

//************ interface file ***************//
@interface MyClass : NSObject {
@public    
  NSNumber *public_num;
@protected 
  NSNumber *protected_num;
@private 
  NSNumber *private_num;
  NSNumber *private_property;
}
@property (retain) NSNumber *public_property;
@property (retain) NSNumber *private_property;
@end

//********* implementation file *********//
@interface MyClass(){
@private
  NSNumber *very_private_num;
}
@property (retain) NSNumber *very_private_property;
@end

@implementation MyClass
@synthesize public_property, private_property, very_private_property;
@end

//****** main **********//
MyClass *myClass = [[MyClass alloc] init];

[myClass setValue:[NSNumber numberWithInt:1] forKey:@"public_num"];
[myClass setValue:[NSNumber numberWithInt:2] forKey:@"protected_num"];
[myClass setValue:[NSNumber numberWithInt:3] forKey:@"private_num"];
[myClass setValue:[NSNumber numberWithInt:4] forKey:@"public_property"]; …
Run Code Online (Sandbox Code Playgroud)

encapsulation private objective-c setvalue ivars

7
推荐指数
1
解决办法
5415
查看次数

使用@synthesize自动iVars

我知道从iOS 4开始,现在可以根本不声明iVars,并允许编译器在您合成属性时自动为您创建它们.但是,我找不到Apple关于此功能的任何文档.

此外,是否有关于使用iVars和属性的最佳实践或Apple推荐指南的文档?我总是使用这样的属性:

.h文件

@interface myClass {
    NSIndexPath *_indexPath
}

@property(nonatomic, retain) NSIndexPath *indexPath

@end
Run Code Online (Sandbox Code Playgroud)

.m文件

@implementation myClass

@synthesize indexPath = _indexPath;

- (void)dealloc {
    [_indexPath release];
}
@end
Run Code Online (Sandbox Code Playgroud)

我使用_indexPath而不是indexPath作为我的iVar名称,以确保我indexPath在需要使用时不会使用self.indexPath.但是现在iOS支持自动属性,我不需要担心.但是,如果我省略了iVar声明,我应该如何处理在dealloc中释放它?我被教导在dealloc中释放时直接使用iVars,而不是使用属性方法.如果我在设计时没有iVar,我可以直接调用属性方法吗?

properties conventions objective-c ios4 ivars

6
推荐指数
2
解决办法
1955
查看次数

我应该在iOS中制作我的ivars属性吗?

就在你认为自己明白了什么的时候,你却没有!:)

我知道如果我将变量设为属性,我可以在类中的任何位置访问它,甚至可以从该类外部设置它.

我想如果我不需要它我可以把它变成一个伊娃.所以我有一个大约5个UILabel的viewcontroller.所以在它的viewDidLoad我说:

pharmacyName.text = self.receivedLocation.name;
    pharmacyTel1.text = @"556-7843";
    pharmacyTel2.text = @"991-2345";
    pharmacyTel3.text = @"800-0001";
Run Code Online (Sandbox Code Playgroud)

当我在.h文件中声明它们时:

@interface DetailViewController : UIViewController{
    IBOutlet UILabel *pharmacyName;
    IBOutlet UILabel *pharmacyTel1;
    IBOutlet UILabel *pharmacyTel2;
    IBOutlet UILabel *pharmacyTel3;
}

@property (nonatomic,strong) MyLocation *receivedLocation;

@end
Run Code Online (Sandbox Code Playgroud)

properties ios ivars

0
推荐指数
1
解决办法
87
查看次数