相关疑难解决方法(0)

声明的属性是否需要相应的实例变量?

Objective-C 2.0中的属性是否需要声明相应的实例变量?例如,我习惯做这样的事情:

MyObject.h

@interface MyObject : NSObject {
NSString *name;
}
@property (nonatomic, retain) NSString *name;
@end
Run Code Online (Sandbox Code Playgroud)

MyObject.m

@implementation
@synthesize name;
@end
Run Code Online (Sandbox Code Playgroud)

但是,如果我这样做了:

MyObject.h

@interface MyObject : NSObject {
}
@property (nonatomic, retain) NSString *name;
@end
Run Code Online (Sandbox Code Playgroud)

这仍然有效吗?它与我之前的例子有什么不同吗?

objective-c instance-variables declared-property

102
推荐指数
3
解决办法
3万
查看次数

如果您在Objective-C中仅使用属性,是否有任何理由声明ivars?

我倾向于在我的类中专门使用属性,特别是现在您可以在类扩展中声明属性,这要归功于现代的Objective-C 2.0运行时 - 我使用此功能来创建"私有"属性.

我的问题是,是否有任何理由再次在类接口中声明ivars.我更喜欢面向公众的界面尽可能地简洁和干净,只是揭示我班级中相关的方面.

例如,我倾向于做以下事情:

MyClass.h:

@interface MyClass : NSObject

@property (nonatomic, copy) NSString * publicString;
@property (nonatomic, copy, readonly) NSString * readOnlyString;

@end
Run Code Online (Sandbox Code Playgroud)

MyClass.m:

@interface MyClass ()

@property (nonatomic, copy, readwrite) NSString * readOnlyString;
@property (nonatomic, copy) NSString * privateString;

@end

@implementation MyClass

@synthesize publicString = publicString_;
@synthesize readOnlyString = readOnlyString_;
@synthesize privateString = privateString_;

- (void)init
{
    self = [super init];

    if (self != nil)
    {
        self.publicString = @"Public String";
        self.readOnlyString = @"Read-Only String";
        self.privateString …
Run Code Online (Sandbox Code Playgroud)

properties objective-c instance-variables

9
推荐指数
1
解决办法
1930
查看次数

Objective-c现代运行时在接口块中使用属性和ivars

我已经看过代码示例(来自"初学iPhone 4开发"一书),它们都在接口块中声明了ivars,然后声明了相同的属性.像这样:

@interface ViewController : UIViewController {
    UITableView *table;
}

@property (nonatomic, retain) IBOutlet UITableView *table;
Run Code Online (Sandbox Code Playgroud)

这个的目的/好处是什么?据我所知,使用现代运行时版本(iPhone和64位OS X应用程序),您只需要声明属性,并且可以省略声明接口块内的ivars.根据similair线程中的这个答案,它将用于调试目的.但除了调试之外还有其他任何好处,你会使用这种方法吗?

干杯,

彼得

iphone properties objective-c instance-variables modern-runtime

8
推荐指数
1
解决办法
678
查看次数

没有ivars - >我错过了什么?

我从不使用伊娃.我只使用属性 - 有时使用基本类型分配属性,有时使用"私有"类扩展.我已经看到了不使用ivars切换到ARC的优点 - 我有一些带有大量ivars的借用代码,我仍然不能"ARC",因为我不知道需要保留什么.所以我知道使用ivars的一些优点,但使用ivars而不是属性有什么好处?

注意:我完全依赖于(通过编译器?)为属性声明自动添加的ivars.

不要标记为关闭:我已经看过其他一些问题,比如这个这个,没有一个问题.标题看起来不错,但就像SO上的那么多问题一样,问题是一堆奇怪的疑惑和其他东西.

objective-c automatic-properties ios

8
推荐指数
1
解决办法
559
查看次数

self.text和_text之间的真正区别

我读了很多关于这个主题的帖子,但我无法完全理解一切.好的,很清楚

self.text = @"MyText" will call the accessory method setText (autogenerated)

_text = @"MyText" will still assign the value but will not call the setText
Run Code Online (Sandbox Code Playgroud)

这很清楚.

但是当我们不使用ARC时,这可能很有用,因为setText将负责内存管理.但是当我们使用ARC时会发生什么?有时如果我使用_text一切正常,有时候如果我不使用"self.text"我的应用程序将无法工作.

那么真正的区别是什么?必须有的不仅仅是内存管理.

让我说我有这个

@interface MyClass:NSObject { 
  NSMutableString *text; 
}

@property (nonatomic ) NSMutableString *text;
Run Code Online (Sandbox Code Playgroud)

在这种情况下是不是相同的呼吁

self.text = @"ok" 
Run Code Online (Sandbox Code Playgroud)

要么

text = @"ok" ?
Run Code Online (Sandbox Code Playgroud)

有什么不同?

iphone cocoa objective-c ios

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